演算法導論之二叉搜尋樹

2021-07-23 09:16:46 字數 2369 閱讀 8428

二叉搜尋樹上的基本操作所花費的時間與這棵樹的高度成正比。

二叉搜尋樹中的關鍵字總是以滿足二叉搜尋樹的性質的方式來進行儲存的:

設x是二叉搜尋樹中的乙個結點,如果y是x左子樹中的乙個結點,那麼y.key<=x.key。如果y是x右子樹中的乙個結點,那麼y.key>x.key。

先序遍歷:

中序遍歷:

inorder-tree-walk(x):

if  x!=null

inorder-tree-walk(x.left);

print x.key;

inorder-tree-walk(x.right);

後序遍歷:

二叉搜尋樹的查詢操作:

有兩種程式的寫法來進行查詢:(1

) tree-search(x,k):

if x==null or k==x.key

return x;              //找到

x或者結點不存在的時候,退出程式

if ktree-search(x.left,k);

elsetree-search(x.right,k);(2

) tree-search(x,k):

while(k!=x.key && k!=null)

return x;

在一般的計算機中,第二種版本的程式執行效率更高一些。

最大元素和最小元素。

最大元素:

tree-maxmum(x):

while x.right!=null

x=x.right;

return x;

最小元素:

tree-minmun(x):

while x.left!=null

x=x.left;

return x;

前驅和後繼(前驅和後繼是將樹形關係轉化為線性的關係時才會有的概念,本例中以樹的中序遍歷為例進行說明,乙個元素的前驅就是指:將樹形結構按照一定的規則進行排列後,排在這個元素前面的元素。後繼結點指的是:將樹形結構按照一定的規則進行排列後,排在這個元素後面的元素):

後繼結點:

tree-successor(x):

if x.right != null

return tree-minmue(x.right);

y=x.p;  //y是

x的父親節點,

.p代表父親節點

while y !=null andx==y.right

x=y;

y=y.p;

return y;

前驅結點跟後繼結點的實現基本相同;

前驅結點:

tree-successor(x):

if x.left!= null

return tree-minmue(x.left);

y=x.p;  //y是

x的父親節點,

.p代表父親節點

while y !=null and x==y.left

x=y;

y=y.p;

return y;

以上兩種查詢前驅結點和後繼結點的演算法,對於高度為h的樹,執行時間為o(h).

插入和刪除:

就插入操作和刪除操作來說,插入操作是比較簡單的。

插入操作:

tree-insert(t,z):        //其中

t表示的是樹t,

z表示的是要插入的結點

y=null;

x=t.root;

while x != null

y=x;

if z.keyx=x.left;

else

x=x.right;

z.p=y;                //跳出

while

迴圈的時候,

x為空,

y已經被放在

z.p的位置

if y==null

t.root=z;        //tree t is empty

else if z.key>y.key

y.right;=z

else 

y.left=z;

程式中的幾個代表元素,x,y,z,x在之前的程式中一直是在找z應該所在的位置,其中,語句y=x;使得y可以定位到x的根的位置,即就是要插入的元素z的根的位置。然後進行判斷,判斷z要插入的正確的位置,將z插入其中。

刪除操作:

刪除操作可以分為三種情況:

(1):要刪除的結點z沒有孩子結點。直接刪除結點z,用null來代替原來的z

(2):要刪除的結點z有乙個孩子結點。刪除結點z,用結點z的孩子結點代替z結點

(3):要刪除的結點z有兩個孩子結點。那麼後繼結點一定在結點

z的右子樹中。

還可以分為下面的這4種情況,更好處理點。

演算法導論 二叉搜尋樹

搜尋樹資料結構支援許多動態集合操作,包括search minimum maximum predecessor successor insert和delete等。因此,我們使用一棵搜尋樹既可以作為乙個字典又可以作為乙個優先佇列。二叉搜尋樹上的基本操作所花費的時間與這棵樹的高度成正比。對於乙個有n個結點...

演算法導論二叉搜尋樹

兩天寫完的,沒有認認真真的測試,可能有些bug,自己測試的資料能過,但是我的初始化有些問題,不知道該怎麼表示 二叉搜尋樹 include include using namespace std struct node void inorder search node root1 node tree ...

演算法導論之二叉查詢樹

還要認真學習啊,功力不夠,要多向師兄師姐學習,自己也要努力。includeusing namespace std 首先進行二叉樹的一些操作的 補上之前欠下的東西 class bintree class treenode class treenode int element,treenode lchi...