bst樹的說明

2021-08-16 04:13:51 字數 4854 閱讀 3034

中序遍歷

遞迴的方法

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,設...