二叉查詢樹

2022-08-27 08:27:08 字數 2940 閱讀 6582

二叉查詢樹(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 ...