bst 二叉搜尋樹簡單實現

2022-07-16 05:45:07 字數 2992 閱讀 6489

//

陣列實現二叉樹:

//1.下標為零的元素為根節點,沒有父節點

//2.節點i的左兒子是2*i+1;右兒子2*i+2;父節點(i-1)/2;

//3.下標i為奇數則該節點有有兄弟,否則又左兄弟

//4.對bst樹的操作主要有插入,刪除,後繼前驅的查詢,樹最大最小節點檢視

#include

using

namespace

std;

struct

node;

node * root =null;

//中序輸出bst中的全部關鍵字

void inorder_tree_walk(node *t)

return;}

//查詢關鍵字k,若存在,則返回指向包含k的節點指標;否則,返回null

node * tree_search(node * t,int

k)

returnt;}

//查詢最小關鍵字的節點

node * tree_minimum(node *t)

//查詢最大關鍵字的節點

node * tree_maximum(node *t)

//查詢節點z的後繼

//1.若該節點有有子樹則其後繼就是該節點有子樹中最小節點

//2.否則其後繼就是其最低祖先節點

node * tree_successor(node *z)

returny;}

//查詢z的前驅節點

node * tree_precursor(node * z)

return y;}//

在bst中插入關鍵字的值為k的節點

//1.插入節點時要尋找該節點的正確位置

//2.然後插入該節點

void tree_insert(node * t,int

k) z->p = y; //

插入該節點

if(y == null) root =z;

else

if(z->key < y->key) y->left =z;

else y->right =z;

return;}

//用以v為根的子樹替換以u為根的子樹

void transplant(node * u, node *v)

//從bst中刪除節點z

//1.被刪除的節點沒有左兒子就用其有兒子來填補

//2.被刪除的節點僅有左兒子就用其左兒子來填補

//3.有兩個兒子的情況:

//a.先找出該節點的乙個後繼結點 y

是該節點的右兒子直接用y填補

//c.否則先用y的右孩子替換y,再用y替換被刪節點

void tree_delete(node *z)

transplant(z,y);

y->left = z->left;

y->left->p =y;

}return;}

intmain();

for(int i=0;i<=7;++i)

inorder_tree_walk(root);

cout

<<"

insert key = 13:

"

13);

inorder_tree_walk(root);

cout

<<"

the min key is :

"cout

<<"

the max key is :

"cout

<<"

the 9's successor is :

"<9))->key

<<"

delete key =18 :

"

18));

inorder_tree_walk(root);

cout

}

二叉搜尋樹:

1.二叉搜尋樹是以一顆二叉樹來組織的,可以用鍊錶資料結構來實現表示,每個節點表示乙個物件,每個節點包含的資訊由其key值及其各方向的指向。

2.對其遍歷可用前中後序遍歷,這裡用的是中序遍歷方法

3.二叉搜尋樹的搜尋方法:待查詢的元素的鍵值比當前結點先就到當前結點的左樹種去尋找,比當前節點大就到當前節點的右樹中去尋找,否則就找到或者到葉子結點也沒找到就返回null

4.查詢一棵樹的最小元素和最大元素:最小元素救是以該節點為根節點的樹的最左邊的葉子節點,而最大元素就是以該節點為根節點的最右邊的葉子結點

5.查詢按照中序遍歷方法中乙個節點的前驅和後繼節點:

a.前驅節點:情況一,該節點的左子樹非空,則該節點的前驅節點就是該右子樹中最大元素;情況二,該節點的左子樹為空,那麼該節點的後繼結點就是沿這這個節點的父節點往上找,並且同時父節點和該節點都上移,直到當前結點是其父節點的右兒子為止,該父節點就是要找的前驅節點

b.後繼節點:情況一,該節點的右子樹非空,則該節點的後繼節點就是該右子樹中最小元素;情況二,該節點的右子樹為空,那麼該節點的後繼結點就是沿這這個節點的父節點往上找,並且同時父節點和該節點都上移,直到當前結點是其父節點的左兒子為止,該父節點就是要找的後繼節點

實際上前驅節點和後繼結點的求法剛好相反

6.插入節點:先找到給節點的正確位置,然後插入進搜尋樹中

7.刪除節點:比較麻煩,情況也比較複雜,因為在刪除的過程中還要維護搜尋樹的性質

a.被刪除的節點只有右兒子,用右兒子來填補該節點

b.被刪除的節點只有左兒子,用左兒子來填補該節點

c.被刪除的節點沒有兒子,則直接刪除

d.被刪除的節點有兩個兒子節點,先找到該節點的後繼節點。情況一,如果該後繼結點就是被刪節點的右兒子,直接用該後繼節點替換該節點;情況二,如果該後繼節點位於被刪節點的右子樹中但不是被刪節點的右兒子,先用該後繼節點的右兒子替換該後繼節點,再用該後繼節點替換被刪除的幾點。

二叉搜尋樹BST

在二叉搜尋樹b中查詢x的過程為 1.若b是空樹,則搜尋失敗,否則 2.若x等於b的根結點的資料域之值,則查詢成功 否則 3.若x小於b的根結點的資料域之值,則搜尋左子樹 否則 4.查詢右子樹 指標parent指向proot的父節點,其初始呼叫值為null 若查詢成功,指標ptarget指向目標節點,...

二叉搜尋樹(BST)

二叉搜尋樹 bst bst 或者是一棵空樹,或者對於任何乙個結點,設其值為k,則該結點的左子樹的值小於k,右結點的值大於k。二叉搜尋樹按照中根遍歷將各個結點列印,將得到按照大到小的順序排列。bsg示意圖 二叉搜尋樹的效率在於檢索,將演算法複雜度從2 k減少到log n 檢索方式 從根結點開始,如果等...

BST二叉搜尋樹

深入學習理解bst include using namespace std typedef struct bitnodebitnode,bitree 二叉樹的插入操作 void insert bitnode root,int x 因為當對空樹插入時,相當於改變了樹的根節點的指向,因此需要用到指標或引...