1、二叉搜尋樹(b樹)
一棵二叉搜尋樹(bst)是以一棵二叉樹來組織的,可以用鍊錶資料結構來表示,其中,每乙個結點就是乙個物件,一般地,包含資料內容key和指向孩子(也可能是父母)的指標屬性。如果某個孩子結點不存在,其指標屬性值為空(nil)。
二叉搜尋樹中的關鍵字key的儲存方式總是滿足二叉搜尋樹的性質:
設x是二叉搜尋樹中的乙個結點。如果y是x左子樹中的乙個結點,那麼會有y.key<=x.key;如果y是x右子樹中的乙個節點,那麼有y.key>=x.key。
二叉搜尋樹上基本操作所花費的時間與這棵樹的高度成正比,對於有n個結點的一棵完全二叉樹而言,這樣的操作的最壞執行時間是o(lgn)。然而如果這棵樹是一條n個結點組成的線性鏈,那麼操作需要花費的時間為0(n)。
由圖可以看出,對於遇到的每個結點x,都會比較x.key與k的大小,如果相等,就終止查詢,否則,決定是繼續往左子樹還是右子樹查詢。因此,整個查詢過程就是從根節點開始一直向下的一條路徑,若假設樹的高度是h,那麼查詢過程的時間複雜度就是o(h)。
查詢二叉搜尋樹
//遞迴實現tree_search(x, k):
if x == nil or x.key == k :
return x
if k < x.key
return tree_search(x.left, k)
else return tree_search(x.right, k)
//非遞迴迭代實現最大關鍵字元素和最小關鍵字元素通過樹根開始沿著left孩子指標一直到nil,可以找到最小元素。tree_search(x, k) :
while x!=nil and k!=x.key:
if k < x.key
x = x.left
else x = x.right
return x
tree-minmum(x)同樣的方法可以找到最大值。while x.left != nil
x = x.left
return x
tree-maxmum(x)查詢最小值和最大值的方法均能夠在o(h)的時間內完成。while x.right!= nil
x = x.right
return x
後繼和前驅
都在利用之前的部分,通過找x的右子樹找到後繼,通過找x的左子樹找到前驅。找前驅和找後繼的方法是相同的。
tree_successor(x):插入操作當需要插入乙個新結點時,從根節點開始,迭代或者遞迴向下移動,直到遇到乙個空的指標nil,需要插入的值即被儲存在該結點位置。這裡給出迭代插入演算法,遞迴方式的比較簡單。if x.right != nil
return tree_minnode(x.right)
y = x.p
while y!=nil and x == y.right
x = y
y = y.p
return y
tree_insert(t, z):刪除操作二叉搜尋樹的節點刪除比較複雜,可以分為三種情況:y = nil
x = t.root
while x != nil
y = x
if z.key < x.key
x = x.left
else x = x.right
z.p = y
if y == nil
t.root = z
else if z.key < y.key
y.left = z
else y.right = z
1、如果z沒有孩子節點,那麼直接刪除,並修改父節點,用nil代替z;
2、如果z只有乙個孩子,那麼將這個孩子節點提公升到z的位置,並修改z的父節點,用z的孩子替換z;
3、如果z有兩個孩子,那麼查詢z的後繼y(y一定在z的右子樹中),然後用y替換z。
對於情況3,可以繼續細分為2種情況:
1.z的後繼y位於右子樹中,但是沒有做孩子,也就是說y的是後繼。
2.z的後繼位於z的右子樹中,但是並不是z的右孩子,此時,用y的右孩子替換y,然後用y替換z。
二叉樹 二叉查詢樹
構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 include include include include using namespace std 二叉樹結點 struct treenode 鍊錶結點 struct listnode struct tempnodetempnode...
二叉樹 二叉查詢樹
二叉樹 binary tree 一種樹型結構,每個節點最多擁有兩個節點。如下圖 幾種型別的二叉樹 1.full binary tree 每個節點的孩子數 是 0 或者 2.對高度沒有要求。如下圖 2.perfect binary tree 這個就是最完美的樹,顧名思義,所有葉子節點都有相同的深度,並...
樹(樹,二叉樹,二叉查詢樹)
1.定義 n n 0 個結點構成的有限集合。當n 0時,稱為空樹 2.對於任一棵非空樹 n 0 它具備以下性質 1 樹中有乙個稱為 根 root 的特殊結點,用 r 表示 2 其餘結點可分為m m 0 個互不相交的有限集t1,t2,其中每個集合本身又是一棵樹,稱為原來樹的子樹。3.樹的一些性質 1 ...