Динамические структуры данных Деревья
Дерево - это частный случай графа, наиболее широко применяемый в программировании. А A, B, C , D E, F, G - вершины 1 уровень С В B C D – потомки вершины А D 2 уровень E F A- корень, предок вершин B C D E F G терминальные вершины (листы) B C D - братья, нетерм-ные вершины (внутренние) G Структура не является деревом, указатели, нарушающие соответствие структуры определению дерева, обозначены желтым
Дерево называют упорядоченным, если для дерева важен порядок ребер, исходящих из вершины. Если же принимается во внимание лишь ориентация вершин, то дерево ориентированное 1 1 2 3 4 2 4 3 Дерево в котором вершин имеют не более двух потомком, называется двоичным (бинарным) деревом Левое Правое
Любой лес n-арных деревьев можно представать в виде двоичного дерева 1 2 5 3 6 15 11 7 8 9 16 13 12 4 14 17 1 11 2 5 15 12 3 13 4 14 6 16 17 7 8 9
Type t: integer; tree_ptr=^tree; tree= record value: t; left, right: tree_ptr; end;
Поиск по дереву Function find(root: tree; key: integer; var p, paent: tree): Boolean; begin p: =root; while p<>nil do begin if key=p^. inf then begin Find =true exit; end; Parent: =p If key
Вставка узла procedure addnode_r(r, prev: ptr; newkey: integer; newdata: info); begini if r = nil then begin new(r); r^. left : = nil; r^. right : = nil; r^. key : = newkey; r^. data : = newdata; if tree = nil then tree : = r; (* Первый узел *) else begin if newkey
Удаление узла
procedure del ( var root : tree ; key : integer ); var p : tree ; {удаляемый узел} parent : tree ; {предок удаляемого узла} y : tree ; {узел, заменяющий удаляемый} function spusk(p: tree): tree; var y : tree ; {узел, заменяющий удаляемый} pred: tree; { предок узла “y”} begin y: =p^. right; if y^. left=nil then y^. left: =p^. left {1} else {2} begin repeat pred: =y; y: =y^. left; until y^. left=nil; y^. left: =p^. left; {3} pred^. left: =y^. right; {4} y^. right: =p^. right; {5} end; spusk: =y; end; begin if not find(root, key, p, parent) then {6} begin writeln(‘ такого элемента нет ’); exit; end; if p^. left=nil then y: =p^. right {7} else if p^. right=nil then y: =p^. left {8} else y: =spusk(p); {9} if p=root then root: =y {10} else {11} if key
Обход дерева прямой обход(сверху вниз): (1, 2, 3, 4 , 5) Попасть в корень Обойти левое поддерево обойти правое поддерево Procedure pass_dir ( t: tree_ptr); Begin if t<>nill then begin write(t^. c); pass_dir(t^. left); pass_dir(t^. right); end. 1 2 3 4 5
Обход дерева обратный обход (снизу вверх) (3, 2, 4, 1, 5) Обойти левое поддерево Попасть в корень Обойти правое поддерево Procedure pass_back ( t: tree_ptr); Begin if t<>nill then begin pass_back(t^. left); write(t^. c); pass_back(t^. right); end. 1 2 3 4 5
Обход дерева концевой обход( слева направо) (3, 4, 2, 5, 1) Обойти левое поддерево Обойти правое поддерево Попасть в корень Procedure pass_end ( t: tree_ptr); Begin if t<>nill then begin pass_end(t^. left); pass_end(t^. right); write(t^. c); end; end. 1 2 3 4 5