//陣列實現二叉樹:
//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 因為當對空樹插入時,相當於改變了樹的根節點的指向,因此需要用到指標或引...