中序遍歷
遞迴的方法
x 為指標
inorder-tree-walk(x)
if(x != null)
inorder-tree-walk(x.left)
print x.key
inorder-tree-walk(x.right)
非遞迴的方法:(將遞迴的實現進行翻譯)
inorder-tree-walk(x)
if(x== null)
return
top= x
stack inorder
while top != null or inorder 不為空
if(top != null)
inorder.push(top)
top = top.left
else
top = inorder.top()
inorder.pop()
print(top)
top = top.right
方法三:先呼叫tree-minmum找到這棵樹中的最小節點,再呼叫n – 1次tree-successor(利用前驅的效果是一樣的
其他遞迴見對應的**
查詢二叉搜尋樹
遞迴演算法:
tree-search(x , key)
ifx == null or k == x.key
return x;
if(x.key < key)
tree-search(x.right, key)
else
tree-search(x.left, key)
非遞迴演算法:
tree-search(x , key)
while x != null and key != x.key
if(key < x.key)
x = x.left
else
x = x.right
return x
得到二叉搜尋樹的最大值或最小值
根據定義最大值為最右側的節點,最小值為最左側的節點
返回乙個指向給定節點x為根的子樹的最小元素,不存在返回null
非遞迴tree-minmum(x)
while x.left != null
x. = x.left
return x
遞迴:tree-minmum(x)
if(x.left == null)
return x
tree-minmum(x.left)
思路:判斷有無左節點,如果沒有則輸出,如果有,則將其賦為左節點,迴圈下去
tree-maxmum(x)
while x.right != null
x = x.right
return x
二叉搜尋樹某個節點的後繼和前驅
可以用中序遍歷來驗證其的正確性
如果後繼存在,返回一棵二叉搜尋樹中的節點x的後繼,否則返回null
tree-successor(x)
ifx.right != null
return tree-minmum(x.right)
y =x.parent
while y != null and x == y.right
x = y
y = x.parent
return y
思路:根據後繼的定義:
若x節點沒有右子樹,只能查詢其父。包含該元素的最小左子樹的節點即為後繼
o(最小左子樹的節點)/o
\o\o(x)
tree-predecessor(x)
ifx.left != null
return maxmum(x.left)
y= x.parent
whiley != null and x == y.left
x = y
y = x.parent
return y
二叉搜尋樹的插入
該過程中將節點z作為輸入,其中z,key= v ,z.left = null ,z.right = null ,將z插入到樹中相應的位置
思路:從樹根出發,指標x記錄了一條向下的簡單路徑,並查詢要替換的輸入項z的null
採用非遞迴的方法
tree-insert(t,z)
y= null; //父節點
x = t.root //遍歷指標
while x != null
y = x
if x.key < x.key
x = x.left
else
x = x.right
z.p = y
if y == null
t.root = z
else if z.key < y.key
y.left = z
else
y.right = z;
二叉搜尋樹的刪除
root為查詢到的節點
一共有四種情況
1.要刪除的節點沒有左右子樹,即為葉子節點
條件:root -> left == null , root -> right ==null
此時要刪除這個節點,則得判斷其父輩的情況
若parent ==null,則證明要刪除的節點root是根節點,則此時只需要將head變為空指標,即head = null
否則,即parent!= null,則需要將parent的某乙個孩子節點賦為空
利用root -> data和parent-> data的大小,判斷root是位於那一邊,並將父節點的那一邊賦為null
刪除節點root
2.要刪除的節點有左子樹,沒有右子樹
條件:root -> left != null root-> right == null
此時要刪除root,則需要用左子樹的根節點來代替root
若parent == null,則證明要刪除的節點root是根節點,則此時只需要將head指向左子樹的根節點即head = root –> left
否則,即parent !=null,
第一步:root ->left -> parent = parent
第二步:判斷root位於parent哪一棵子樹,將parent的那一棵子樹賦為root -> left.
刪除節點root
3.要刪除的節點有右子樹,沒有左子樹(類似於上面)
4.要刪除的節點有左右子樹
條件:root -> left!= null root -> right != null
此時要刪除root,則需要用root的後繼來代替root(由於右子樹存在,實際上是取右子樹的最小值)
第一步:找到root的後繼
第二步: 判斷後繼的位置
若後繼恰好是root的右子樹節點,即root -> right == successor無須修改後繼的parent,則只需將root的左子樹賦給後繼,即successor -> left = root -> left root -> left -> parent = successor
否則,則需先修改後繼的parent,講後繼的右子樹賦給parent的左子樹,即successor -> parent -> left= successor -> right successor -> right -> parent = successor -> parent,然後講root的左右子樹賦給successor(successor-> left = root -> left root ->left -> parent = successor successor-> right = root -> right root-> right -> parent = successor
第三步:successor -> parent = parent
第四步:
若parent == null,則證明root是根節點,則此時只需要head = successor
否則parent != null,判斷root位於哪一棵子樹,將那一棵子樹賦為successor
刪除節點root
為了在二叉搜尋樹內移動子樹,定義乙個子過程transplant,它是用另一棵子樹替代一棵子樹並成為其雙親的孩子節點。當transplant用一棵以v為根的子樹來替換一棵以u為根的子樹時,節點u的雙親就變成v的雙親,並且最後v成為u的雙親相應的孩子
transplant(t,u,v)
if(u,parent == null)
t.root = v
else if(u == u,parent.left)
u.parent.left = v
else
u,parent.right = v
if(v != null)
v,p = u.p
下面是從二叉搜尋樹t中刪除節點z的刪除過程
tree-delete(t,z)
if(z.left == null)
transplant(t,z,z.right)
else if(z.right == null)
transplant(t,z,z.left)
else
y = tree-minmum(z.right) //y是沒有左孩子的
if(y.p != z)
//若y不是z的右孩子,則須將y的父輩先處理好在進行操作
transplant(t,y,y.right)(在這個過程中y.right.parent = y.parent,y,paret.left = y.right)
y.right = z.right
z.right.parent = y.
transplant(t,z,y)
//將root的子樹賦給後繼,並修改子樹的根節點
y.left = z.left
z.left.parent = y
delete z
BST樹的定義
二叉搜尋樹 bst樹 又叫二叉排序樹,二叉查詢樹。它或者是一棵空樹 或者是具有以下性質的二叉樹 1.每個結點都有乙個資料域,且所有節點的資料域互不相同 2.若它的左子樹不為空,則左子樹上的所有結點的值都小於根節點的值 3.若它的右子樹不為空,則右子樹上的所有節點的值都大於根節點的值 4.左子樹和右子...
BST樹的查詢
bst樹的查詢 1 查詢思想 首先將給定的k值與二叉排序樹的根結點的關鍵字進行比較 若相等 則查詢成功 給定的k值小於bst的根結點的關鍵字 繼續在該結點的左子樹上進行查詢 給定的k值大於bst的根結點的關鍵字 繼續在該結點的右子樹上進行查詢。2 演算法實現 遞迴演算法 bstnode bst se...
BST樹的基本實現
基本操作 建立,銷毀,清空,增刪改查,先中後層遍歷。都很簡單,就是刪除乙個節點要分類討論。在乙個二叉搜尋樹中,乙個基本性質,左子樹的所有節點小於根節點,右子樹的所有節點大於等於根節點,依據這個性質討論刪除操作。當被刪除元素左子樹為空 右子樹為空,或者都為空,直接用左子樹或者右子樹替代。如刪除15,設...