二叉搜尋樹的搜尋 插入 後繼 刪除

2021-07-09 23:56:46 字數 2550 閱讀 3088

二叉搜尋樹

二叉搜尋樹是以二叉樹是形式表示的,這樣就可以使用乙個二叉鍊錶來表示二叉搜尋樹了。

對於任何結點x,其左子樹的關鍵字的值不大於x.key,右子樹的關鍵字不小於x.key。

二叉搜尋樹支援insert、delete、search、maximum、minimum、predecessor(前驅結點)、successor(後繼結點)等操作。二叉搜尋樹的基本操作與樹的高度成正比,對於乙個有n個結點的完全二叉樹來說,這些操作的最壞執行時間為o(lg n)。若要將n個結點組織成乙個線性鏈,最壞執行時間將達到o(n)。

下面是二叉搜尋樹的定義:

typedef

struct binary_search_tree btree;

struct

struct binary_search_tree

*pnode;

遍歷

由於左子樹 <= 結點 <= 右子樹,所以就可以用中序遍歷就可以將一棵二叉搜尋樹按順序輸出。
inorder_btree(pnode *root)

}

查詢從根結點開始進行比較,若給定結點的key大於根結點,則沿右子樹繼續查詢;若小於根結點的key,則沿著左子樹查詢。直到找到返回該結點為止,否則返回null。

btree search(pnode *root, int key)

上面是遞迴實現的search,下面是迭代實現的:

btree search(pnode *root, int key)

if(root->key == key)

return root;

else

return root;

}

除了上述查詢操作,還有maximum和minimum,即查詢以為某一結點為根的子樹中的最小結點(僅以minimum為例)。

btree minimum(pnode *root)

前驅和後繼

給定乙個結點x,大於x.key的最小關鍵字結點就是x的後繼結點。如果後繼存在,就返回x的後繼結點;若x的關鍵字就是這棵樹中最大的,就返回null。
尋找後繼結點分兩種情況:

}以上是二叉搜尋樹的幾個簡單基本操作。insert操作僅需要按照二叉搜尋樹的性質將結點插入相應位置即可。

下面是insert的**:

insert(pnode *root, btree t)//t為待插入結點

t->

parent

= y;

if(y ==

null)//待插入二叉樹為空

root = t;

else

if(t->key < y->key)/*判斷待插入結點是作為雙親結點的左子樹還是右子樹*/

y->left = t;

else

y->right = t;

}

最複雜就是刪除結點的操作,要用到以上相關操作…………下次再寫delete

————————————————————————————————————

接著昨天未完成的delete函式

對於刪除一棵二叉搜尋樹的節點x來說,分以下三種情況:

下面是delete函式:

void delete(pnode *root, btree x)

else

//x是非根葉子結點

}else

if(x->right !=

null

&& x->left==

null)//只有右子樹的情況

else

if(x->left !=

null

&& x->right ==

null)//只有左子樹的情況

else

//左右孩子都存在的情況

else

free(temp);}}

總結:本來delete函式思路不是特別複雜,但是在修改指標時還要判斷被刪結點x是其雙親結點的左孩子還是右孩子,所以在只有乙個子樹的情況中,**顯得有些冗雜。

在《演算法導論》中,關於二叉搜尋樹的刪除給出了乙個transplant函式作為delete的內部函式使用,但還是覺得不如自己思路來的清晰。有興趣的可以查閱該書(第三版)的168頁來研究一下。

二叉搜尋樹的插入 刪除

二叉搜尋樹 就是每乙個結點的data值,都大於它的所有左孩子的data,小於所有右孩子的data 二叉搜尋樹的插入刪除的模擬 pragma once namespace ljc template class t friend class binarysorttree template class t...

搜尋二叉樹 插入 刪除)

1.1搜尋二叉樹的概念 二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有一下性質的樹 1.2二叉搜尋樹操作 1.二叉搜尋樹的查詢 若根節點不為空 否則,返回false node find const k key else if cur kv.first kv.first else return...

二叉搜尋樹的插入,查詢,刪除

include using namespace std template class node 預設析構函式 templatenode node template node node t value template class bstree 預設析構 void buildbstree 建立二叉樹 ...