二叉搜尋樹
二叉搜尋樹是以二叉樹是形式表示的,這樣就可以使用乙個二叉鍊錶來表示二叉搜尋樹了。
對於任何結點x,其左子樹的關鍵字的值不大於x.key,右子樹的關鍵字不小於x.key。
二叉搜尋樹支援insert、delete、search、maximum、minimum、predecessor(前驅結點)、successor(後繼結點)等操作。二叉搜尋樹的基本操作與樹的高度成正比,對於乙個有n個結點的完全二叉樹來說,這些操作的最壞執行時間為o(lg n)。若要將n個結點組織成乙個線性鏈,最壞執行時間將達到o(n)。
下面是二叉搜尋樹的定義:
typedef
struct binary_search_tree btree;
struct
struct binary_search_tree
*pnode;
遍歷
由於左子樹 <= 結點 <= 右子樹,所以就可以用中序遍歷就可以將一棵二叉搜尋樹按順序輸出。
inorder_btree(pnode *root)
}
查詢從根結點開始進行比較,若給定結點的key大於根結點,則沿右子樹繼續查詢;若小於根結點的key,則沿著左子樹查詢。直到找到返回該結點為止,否則返回null。
btree search(pnode *root, int key)
上面是遞迴實現的search,下面是迭代實現的:
btree search(pnode *root, int key)
if(root->key == key)
return root;
else
return root;
}
除了上述查詢操作,還有maximum和minimum,即查詢以為某一結點為根的子樹中的最小結點(僅以minimum為例)。
btree minimum(pnode *root)
前驅和後繼
給定乙個結點x,大於x.key的最小關鍵字結點就是x的後繼結點。如果後繼存在,就返回x的後繼結點;若x的關鍵字就是這棵樹中最大的,就返回null。
尋找後繼結點分兩種情況:
}以上是二叉搜尋樹的幾個簡單基本操作。insert操作僅需要按照二叉搜尋樹的性質將結點插入相應位置即可。
下面是insert的**:
insert(pnode *root, btree t)//t為待插入結點
t->
parent
= y;
if(y ==
null)//待插入二叉樹為空
root = t;
else
if(t->key < y->key)/*判斷待插入結點是作為雙親結點的左子樹還是右子樹*/
y->left = t;
else
y->right = t;
}
最複雜就是刪除結點的操作,要用到以上相關操作…………下次再寫delete
————————————————————————————————————
接著昨天未完成的delete函式
對於刪除一棵二叉搜尋樹的節點x來說,分以下三種情況:
下面是delete函式:
void delete(pnode *root, btree x)
else
//x是非根葉子結點
}else
if(x->right !=
null
&& x->left==
null)//只有右子樹的情況
else
if(x->left !=
null
&& x->right ==
null)//只有左子樹的情況
else
//左右孩子都存在的情況
else
free(temp);}}
總結:本來delete函式思路不是特別複雜,但是在修改指標時還要判斷被刪結點x是其雙親結點的左孩子還是右孩子,所以在只有乙個子樹的情況中,**顯得有些冗雜。
在《演算法導論》中,關於二叉搜尋樹的刪除給出了乙個transplant函式作為delete的內部函式使用,但還是覺得不如自己思路來的清晰。有興趣的可以查閱該書(第三版)的168頁來研究一下。
二叉搜尋樹的插入 刪除
二叉搜尋樹 就是每乙個結點的data值,都大於它的所有左孩子的data,小於所有右孩子的data 二叉搜尋樹的插入刪除的模擬 pragma once namespace ljc template class t friend class binarysorttree template class t...
搜尋二叉樹 插入 刪除)
1.1搜尋二叉樹的概念 二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有一下性質的樹 1.2二叉搜尋樹操作 1.二叉搜尋樹的查詢 若根節點不為空 否則,返回false node find const k key else if cur kv.first kv.first else return...
二叉搜尋樹的插入,查詢,刪除
include using namespace std template class node 預設析構函式 templatenode node template node node t value template class bstree 預設析構 void buildbstree 建立二叉樹 ...