2. 最大關鍵字元素和最小關鍵字元素
2. 插入和刪除
2. 刪除
1. 概述
一棵二叉搜尋樹是以一棵二叉樹組織的,其中每個結點就是乙個物件,每個節點包含屬性left、right、p
,它們分別指向結點的左孩子,右孩子和雙親,如果某個結點的孩子的屬性值不在,則為nil。對任何結點x,x左子樹中的關鍵字最大不超過x.key,右子樹中的關鍵字最小不低於x.key。
二叉搜尋樹上基本操作所花費的時間與這棵樹的高度成正比。對於有n個節點的完全二叉樹來說,操作的最壞執行時間為θ(lgn)
,如果這棵樹是一條n個節點組成的線性鏈,操作的最壞執行時間為θ(n)
2. 查詢二叉搜尋樹
1. 查詢
通過輸入乙個指向樹根的指標和乙個關鍵字k查詢結點,如果結點存在,返回乙個指向關鍵字為k的節點的指標
1. 查詢偽**
iterative-tree-search(x, k)
while x ≠ nil and k ≠ x.key
if(k < x.key)
x = x.left
else x = x.right
return x
2. 最大關鍵字元素和最小關鍵字元素
1. 最小關鍵字元素
通過樹根沿著left孩子指標直到遇到乙個nil,返回乙個指向在已給定結點x為根的子樹中的最小元素的指標。假設不為nil
2. 最小關鍵字元素偽**
tree-minimum(x)
while x.left ≠ nil
x = x.left
return x
3. 最大關鍵字元素偽**tree-maximum(x)
while x.right ≠ nil
x = x.right
return x
4. 後繼和前驅
如果乙個二叉樹所有的關鍵字都不相同,則乙個結點x的後繼是大於x.key的最小關鍵字的結點。
5. 後繼偽**
tree-successor(x)
if x.right ≠ nil
return tree-minimum(x.right)
y = x.p
while y ≠ nil and x == y.right
x = y
y = y.p
retrun y
在乙個高度為h的我二叉搜尋樹上,上面幾種的動態集合上的操作可以在o(h)
時間內完成
2. 插入和刪除
1. 插入
1. 插入偽**
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
elseif z.key < y.key
y.left = z
else y.right = z
2. 刪除
刪除會有以下四種情況:
結點z沒有左孩子,用右孩子r來替換z,其中r可以使nil,也可以不是
結點z有乙個左孩子h,但沒有右孩子,用h來替換z
結點z有兩個孩子,其左孩子是結點h,右孩子r還是其後繼,r的右孩子是結點x,用r替換z,修改h成為r的左孩子,但保留x仍為r的右孩子,
結點z有左孩子h和右孩子r且為q的孩子,並且z的後繼y ≠ r
位於以r為根的子樹中,用y自己的右孩子來代替y,並且置y為r的雙親,然後再置y為q的孩子和h的雙親
1. 移動偽**
transplant(t, u, v)
if u.p == nil
t.root = v
elseif u == u.p.left
u.p.left = v
else u.p.right = v
if v ≠ nil
v.p = u.p
2. 刪除偽**tree-delete(t, z)
if z.left = nil
transplant(t, z, z.right)
elseif z.right == nil
transplant(t, z, z.left)
else y = tree-minimum(z.right)
if y.p ≠ z
transplant(t, y, y.right)
y.right = z.right
y.right.p = y
transplant(t,z,y)
y.left = z.left
y.left.p = y
在一棵高度為h的二叉搜尋樹上,實現動態插入和刪除的執行時間均為o(h)
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...
二叉搜尋樹開始部分 驗證二叉搜尋樹 附帶介紹
每個節點中的值必須大於儲存在其左側子樹中的任何值。每個節點中的值必須小於儲存在其右子樹中的任何值。首先二叉搜尋樹有個特性即它的中序遍歷為乙個遞增的有序序列那麼我們就可以利用這個特性來驗證二叉搜尋樹,我們只要判斷list.get i 1 list.get i 就可以判斷不是二叉搜尋樹,如果迴圈完畢則是...
二叉搜尋樹 修剪二叉搜尋樹
第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...