二叉查詢樹(binary search tree)也稱二叉搜尋樹、有序二叉樹(ordered binary tree),排序二叉樹(sorted binary tree),是指一棵空樹或者具有下列性質的二叉樹:
支援的操作:
插入和刪除
偽**:
x = t.root
遍歷
//中序遍歷
inorder-tree-walk(x)
ifx ≠ nil
inorder-tree-walk(x.left)
print x.key
inorder-tree-walk(x.right)
查詢
//遞迴版tree-search(x,k)
if x == nil or k ==x.key
return
x
if k return tree-search(x.left,k)
else
return tree-search(x.right,k)
//迭代版
iterative-tree-search(x,k)
while
x ≠ nil and k ≠ x.key
if k x =x.left
else
x =x.right
return x
最大關鍵字元素和最小關鍵字元素
//最小關鍵字元素
tree-min(x)
while
x.left ≠ nil
x =x.left
returnx//
最大關鍵字元素
tree-max(x)
while
x.left ≠ nil
x =x.right
return x
後繼和前驅
//中序遍歷後繼
tree-successor(x)
if x.right ≠ nil//
x有右孩子,則後繼是其右孩子的最小關鍵字元素
return tree-min(x.right)
//x無右孩子,若x是左孩子,則後繼是其父結點,若x是右孩子,則後繼是x的有左孩子的最底層祖先,可能不存在(nil)
y =x.p
while y ≠ nil and x ==y.right
x =y
y =y.p
returny//
中序遍歷前驅
tree-predeccessor(x)
if x.left ≠ nil//
x有左孩子,則後繼是其左孩子的最大關鍵字元素
return tree-max(x.left)
//x無左孩子,如果當前結點是其父親的右孩子,則該父親是其前驅
y =x.p
while y ≠ nil and x==y.left
x =y
y =y.p
return y
插入
//先找到插入位置,再確定插入結點是左孩子、右孩子還是樹根,每次插入的新的結點都是二叉查詢樹上新的葉子結點
tree-insert(t,z)
y = nil//
記錄z父結點
x = t.root//
記錄z的插入位置
while
x ≠ nil
y =x
if z.key x =x.left
else
x =x.right
z.p =y
if y ==nil
t.root =z
else
if z.key y.left =z
else
y.right = z
刪除
//用子樹v替換子樹u,並建立v與u.p的父子關係
transplant(t,u,v)
if u.p ==nil
t.root =v
else
if u ==u.p.left
u.p.left =v
else
u.p.right =v
ifv ≠ nil
v.p =u.p
//刪除,分三種情況
tree-delete(t,z)
if z.left == nil//
左子樹為空
transplant(t,z,z.right)
else
if z.right == nil//
右子樹為空
transplant(t,z,z.left)
else
//又分兩種情況
y = tree-min(z.right)//
z的後繼
if y.p ≠ z//
y不是z的右孩子就將其轉換成右孩子
transplant(t,y,y,right)
y.right =z.right
y.right.p =y
transplant(t,z,y)
y.left = z.left//
建立y與z.left的父子關係
y.left.p = y
時間複雜度:
二叉查詢樹search,minimum,maximum,predecessor,successor,insert,delete的時間複雜度t(n)=o(h),o(lg n)=中序遍歷二叉查詢樹可得到乙個關鍵字的有序序列。
每次插入的新的結點都是二叉查詢樹上新的葉子結點,在進行插入操作時,不必移動其它結點,只需改動某個結點的指標,由空變為非空即可。
二叉樹 二叉查詢樹
構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 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 ...