Drzewa BST - Notatki - Programowanie, Notatki'z Informatyka. Szczecin University of Technology
Norbert_88
Norbert_8812 April 2013

Drzewa BST - Notatki - Programowanie, Notatki'z Informatyka. Szczecin University of Technology

DOC (137.5 KB)
4 strony
957Liczba odwiedzin
Opis
Informatyka: notatki z zakresu programowania dotyczące drzew BST (binary search tree).
20punkty
Punkty pobierania niezbędne do pobrania
tego dokumentu
Pobierz dokument
Podgląd3 strony / 4
To jest jedynie podgląd.
Zobacz i pobierz cały dokument.
To jest jedynie podgląd.
Zobacz i pobierz cały dokument.
To jest jedynie podgląd.
Zobacz i pobierz cały dokument.
To jest jedynie podgląd.
Zobacz i pobierz cały dokument.

Drzewa BST (binary search tree)

Drzewo BST jest drzewiastą strukturą danych, w której wartość w każdym węźle jest większa lub równa niż wartość jego lewego syna i mniejsza lub równa niż wartość jego prawego syna. Poniżej widać przykład drzewa BST posortowanego wg kolejności alfabetycznej. Strzałki wskazują od wcześniejszego do późniejszego słowa.

Tworzenie drzewa BST

Zaczynamy od pustego korzenia. Następnie wstawiamy elementy zaczynając od korzenia i porównując je. Jeśli wstawiany element jest większy, idziemy na prawo, jeśli mniejszy - na lewo. Wstawiamy dac.

Wstawiamy ccc. Ponieważ ccc < dac, więc idziemy na lewo.

Wstawiamy daa. Ponieważ daa < dac, więc idziemy na lewo. Ponieważ daa > ccc, więc idziemy na prawo.

Wstawiamy egh. Ponieważ egh > dac, więc idziemy na prawo.

Wstawiamy deg. Ponieważ deg > dac, więc idziemy na prawo. Ponieważ deg < egh, więc idziemy na lewo.

Wstawiamy bag. Ponieważ bag < dac, więc idziemy na lewo. Ponieważ bag < ccc, więc idziemy na lewo.

Wstawiamy fab. Ponieważ fab > dac, więc idziemy na prawo. Ponieważ fab > egh, więc idziemy na prawo.

Zadanie 1. Przedstawić drzewo BST jakie powstanie, gdy będziemy do niego wstawiać elementy 23, 34, 44, 12, 16, 8, 19, 37, 28

w takiej kolejności.

Przechodzenie drzewa BST

Poznamy trzy metody przechodzenia drzewa.

PREORDER. W metodzie preorder dla każdego węzła trzymamy się zasady: najpierw wypisujemy zawartość węzła, potem przechodzimy do lewego poddrzewa, potem do prawego poddrzewa (w każdym z poddrzew oczywiście postępujemy tak samo).

INORDER. W metodzie inorder dla każdego węzła trzymamy się zasady: najpierw przechodzimy do lewego poddrzewa, potem wypisujemy zawartość węzła, potem przechodzimy do prawego poddrzewa (w każdym z poddrzew oczywiście postępujemy tak samo).

POSTORDER. W metodzie postorder dla każdego węzła trzymamy się zasady: najpierw przechodzimy do lewego poddrzewa, potem do prawego poddrzewa, na końcu wypisujemy zawartość węzła (i tak samo w każdym poddrzewie).

Przechodzenie drzewa

daje następujące rezultaty:

PREORDER: dac, ccc, bag, daa, egh, deg, fab INORDER: bag, ccc, daa, dac, deg, egh, fab POSTORDER: bag, daa, ccc, deg, fab, egh, dac

Zauważmy, że przechodzenie drzewa BST metodą inorder wypisuje elementy w kolejności rosnącej. Zadanie 2. Przejść każdą z metod drzewo zbudowane w zadaniu 1. Klasa TTree Zbudujemy klasę TTree jak niżej:

type TData = string[30];

PNode = ^TNode; TNode = record data : TData; left : PNode; right : PNode; parent : PNode; end;

TTree = class root : PNode; nodes : string; procedure Inorder(var p : PNode); procedure Preorder(var p : PNode); procedure Postorder(var p : PNode); function Search(x : TData; var p : PNode): PNode; function IterSearch(x : TData; p : PNode): PNode; function Minimum(p : PNode): PNode; function Maximum(p: PNode): PNode; function Successor(p : PNode): PNode; function Predecessor(p : PNode): PNode; procedure InsertNode(var p : PNode); function DeleteNode(var p : PNode): PNode; end;

Procedury Inorder, Postorder, Preorder przechodzą drzewo odpowiednimi metodami.

Funkcje Search i IterSearch wyszukują element x w drzewie rozpoczynającym się w węźle p i zwracają wskaźnik do znalezionego elementu.

Funkcje Minimum i Maximum zwracają wskaźniki do najmniejszego i największego elementu w drzewie.

Funkcje Successor i Predecessor zwracają wskaźnik do elementu drzewa, który następuje (wg porządku) po elemencie (Successor) lub przed elementem (Predecessor) wskazywanym przez p.

Procedury InsertNode i DeleteNode, odpowiednio, dołączają lub odrywają węzły z drzewa.

A tak wygląda kod tych funkcji:

procedure TTree.Inorder(var p : PNode); const CR = #0d; begin if p<>nil then begin Inorder(p^.left); Nodes:=Nodes+p^.data+' '; Inorder(p^.right); end; end; procedure TTree.Preorder(var p : PNode); begin if p<>nil then begin Nodes:=Nodes+p^.data+' '; Preorder(p^.left); Preorder(p^.right); end; end; procedure TTree.Postorder(var p : PNode); begin if p<>nil then begin Postorder(p^.left);

Postorder(p^.right); Nodes:=Nodes+p^.data+' '; end; end; function TTree.Search(x : TData; var p : PNode): PNode; begin if (p=nil) or (x=p^.data) then Search:=p; if x < p^.data then Search(x,p^.left) else Search(x,p^.right); end; function TTree.IterSearch(x : TData; p : PNode): PNode; begin while (p<>nil) and (x<>p^.data) do if x < p^.data then p:=p^.left else p:=p^.right; IterSearch:=p; end; function TTree.Minimum(p : PNode): PNode; begin while p^.left<>nil do p:=p^.left; Minimum:=p; end; function TTree.Maximum(p: PNode): PNode; begin while p^.right<>nil do p:=p^.right; Maximum:=p; end; function TTree.Successor(p : PNode): PNode; var temp : PNode; begin if p^.right<>nil then Successor:=Minimum(p^.right); temp:=p^.parent; while (temp<>nil) and (p=temp^.right) do begin p:=temp; temp:=temp^.parent; end; Successor:=temp; end; function TTree.Predecessor(p : PNode): PNode; begin

end; procedure TTree.InsertNode(var p : PNode); var temp1, temp2 : PNode; begin temp1:=nil; temp2:=root; while temp2<>nil do begin temp1:=temp2; if p^.data < temp2^.data then temp2:=temp2^.left else temp2:=temp2^.right; end; p^.parent:=temp1; if temp1=nil then root:=p else if p^.data < temp1.data then temp1.left:=p else temp1.right:=p; end; function TTree.DeleteNode(var p : PNode): PNode; var temp1, temp2 : PNode; begin if (p^.left=nil) or (p^.right=nil) then temp1:=p else temp1:=Successor(p);

if temp1^.left<>nil then temp2:=temp1^.left else temp2:=temp1^.right; if temp2<>nil then temp2^.parent:=temp1^.parent; if temp1^.parent=nil then root:=temp2 else if temp1=temp1^.parent^.left then temp1^.parent^.left:=temp2 else temp1^.parent^.right:=temp2; if temp1<>p then p^.data:=temp1^.data;

DeleteNode:=temp1; end;

komentarze (0)
Brak komentarzy
Bądź autorem pierwszego komentarza!
To jest jedynie podgląd.
Zobacz i pobierz cały dokument.
Docsity is not optimized for the browser you're using. In order to have a better experience we suggest you to use Internet Explorer 9+, Chrome, Firefox or Safari! Download Google Chrome