(1)二叉查詢樹的定義
二叉查詢樹是一棵二叉樹,如果樹不為空,那麼需滿足如下的性質:
1)每乙個元素都有乙個關鍵字,且任何兩個不同的元素的關鍵字不相等,即關鍵字惟一;
2)左子樹(如果存在)中的關鍵字小於根節點的關鍵字;
3)右子樹(如果存在)中的關鍵字大於根節點的關鍵字;
4)左右子樹也是二叉查詢樹。
(2)二叉查詢樹的查詢、刪除和插入
a. 查詢 二叉查詢樹的查詢從根結點開始,若當前結點的關鍵字等於要查詢的關鍵字,那麼返回當前結點;如果當前結點的關鍵字小於要查詢的關鍵字,那麼從左子樹中開始尋找,否則從右子樹中開始尋找。c++**實現如下:
1 templateview code2 treenode* tree::find(const
t data)314
return
null;
15 }
延伸:如果查詢樹中第k小的元素,那麼可以為每個結點增加乙個欄位leftsize:這個欄位為當前結點的左子樹中的元素數目加1,即表示當前結點在整個樹中的關鍵字的排列順序,因而可以如下實現:
1 templateview code2 treenode* tree::find(intk)3
14else
15return
cur;16}
17return
null;
18 }
b. 刪除
利用查詢的思路,從根節點開始查詢要刪除的關鍵字,並記錄其父結點,如果找到了關鍵字,那麼根據下面三種情況進行刪除:
i) 如果要刪除的結點為葉結點,那麼只需將父結點指向葉結點的指標設為null並釋放掉當前葉結點即可;
ii)如果要刪除的結點只有乙個子女,那麼只需將當前結點的父結點對應的指標指向該子女即可,並釋放當前結點;
iii)如果要刪除的結點有兩個子女,那麼可以用其左子樹的最大元素或者右子樹的最小元素的關鍵字替代當前結點,然後根據替代的關鍵字將刪除操作轉移至對應的左子樹或者右子樹中,最終要被刪除的結點要麼是葉結點要麼是只有乙個子女的結點,即i)和ii)的情形,此時刪除就很方便,**實現如下:
1 templateview code2bool tree:: delete(treenode* node, const
t data)313
else
if(p->data
1418
else
1927
else
if(!p->leftchild && p->rightchild)
2831
if(q->leftchild ==p)
32 q->leftchild =temp;
33else
34 q->rightchild =temp;
35delete p;
36return
true;37
}38else
3947}48
}49 }
c. 插入
插入時,首先尋找要插入的關鍵字,如果找到那麼不需要再插入,如果沒有找到,那麼將新的結點插入到查詢過程中的最後乙個結點位置處即可,實現如下:
1 templateview code2bool tree:: insert(const
t data)312
while
(p)13
19else
if(p->data
2024
else
25return
false;26
}
27if(q->data
28 q->rightchild =newnode;
29else
30 q->leftchild =newnode;
31 }
如果用h表示該二叉查詢樹的高度,那麼上述的操作的時間複雜度都為o(h).
樹(樹,二叉樹,二叉查詢樹)
1.定義 n n 0 個結點構成的有限集合。當n 0時,稱為空樹 2.對於任一棵非空樹 n 0 它具備以下性質 1 樹中有乙個稱為 根 root 的特殊結點,用 r 表示 2 其餘結點可分為m m 0 個互不相交的有限集t1,t2,其中每個集合本身又是一棵樹,稱為原來樹的子樹。3.樹的一些性質 1 ...
二叉樹 二叉查詢樹
構建二叉樹,判斷是否為二叉查詢樹,遞迴先序遍歷,非遞迴中序遍歷 include include include include using namespace std 二叉樹結點 struct treenode 鍊錶結點 struct listnode struct tempnodetempnode...
二叉樹 二叉查詢樹
二叉樹 binary tree 一種樹型結構,每個節點最多擁有兩個節點。如下圖 幾種型別的二叉樹 1.full binary tree 每個節點的孩子數 是 0 或者 2.對高度沒有要求。如下圖 2.perfect binary tree 這個就是最完美的樹,顧名思義,所有葉子節點都有相同的深度,並...