簡介:
二叉查詢樹(binary search tree),(又:二叉搜尋樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。
構造過程:
二叉搜尋樹的節點各項資料域同其他樹形結構一樣,包括資料域,指向自己左孩子和右孩子的指標。
插入:其他:
根據插入策略可得:任意根節點,其左孩子小於它,右孩子均大於它。因此根據二叉樹中的中序遍歷可以將無序序列有序輸出。
c語法實現:
#include
using
namespace std;
typedef
struct node
*btree;
void
init_node
(btree &t,
int e)
void
insert_node
(btree &t,
int e)
else
if(t-
>data < e)
insert_node
(t->right, e)
;else
if(t-
>data > e)
insert_node
(t->left, e);}
void
create_bstree
(btree &t,
int n)
}void
print_tree
(btree &t)
intmain()
查詢:
遞迴查詢
btree search_node
(btree &t,
int e)
使用上述的print_tree()函式也可以實現查詢過程。
迭代查詢:
迭代查詢類似二分查詢。至少在邏輯上是相似的,如果相等則返回,大於則去右邊找,小於則去左邊找。
btree search_iteration
(btree &t,
int e)
return
null
;}
這麼寫其實是有bug的。如果返回null,而主函式又輸出查詢結果,則程式直接會崩潰掉。因此可以將查詢函式返回型別改為bool或者在主函式中加入邏輯判斷。
節點刪除:
刪除分析:
為方便表示,待刪除節點用p表示,待刪除節點的父節點用f表示。
節點的刪除主要分三種情況:
p既有左孩子又有右孩子
p僅有左孩子或者右孩子
p為葉子節點
待刪除節點位置:
為什麼要考慮p的位置呢?若p為根節點,則其父節點f為null,對null操作會引起程式崩潰。
p的三種情況中2、3較為容易理解,因此以下,先分析2、3兩種情況。
關於2、3種情況分析:
情況2:p僅有乙個孩子,因此直接讓f指向p的孩子即可。
根據二叉搜尋樹的特點:其左孩子均不大於它,其右孩子均不小於它。p的孩子放在f下仍滿足該特點。例如,p是f的左孩子。 p僅有左孩子l,則滿足l小於p,l小於f,則f可直接指向l。若p為f的右孩子,則p大於f,l雖小於p,但是l大於f,因此f直接指向p僅有的孩子仍滿足二叉搜尋樹的特性。
情況3:p為葉子節點,因此f直接指向null,且釋放p所佔記憶體即可。
因為p為空,因此f的左孩子或者右孩子直接指向null即可。
關於情況1的分析:
法一:因為p存在左右孩子,因此直接指向其中的乙個孩子,將破壞二叉搜尋樹的特性。但是分析可以發現,選取p左子樹中的最大值節點取代p的位置後,序列仍滿足搜尋樹特性(p左子樹中的最大值仍小於p右子樹的根,且大於左子樹內的任意乙個節點)。
法二:通過法一的分析,可以發現,p右子樹中的任意節點均大於左子樹中的節點。因此將p右子樹掛到p左子樹中的最大值節點下,即可滿足搜尋樹的特性。但是無疑會增加樹的高度。
**示例:
int
delete_node
(btree &t,
int e)if(
!p)return0;
q = p;
if(p-
>left && p-
>right)
p->data = s-
>data;
if(q != p) q-
>right = s-
>left;
else q-
>left = s-
>left;
delete s;
return1;
}elseif(
!p->left)
elseif(
!p->right)if(
!f) t = p;
else
if(q == f-
>left) f-
>left = p;
else f-
>right = p;
delete q;
}
二叉搜尋樹c 資料結構二叉搜尋樹
在n個動態的整數中搜尋某個整數?檢視其是否存在 假設使用動態陣列存放元素,從第 0 個位置開始遍歷搜尋,平均時間複雜度 o n 如果維護乙個有序的動態陣列,使用二分搜尋,最壞時間複雜度 o logn 但是新增 刪除的平均時間複雜度是 o n 針對這個需求,有沒有更好的方案?今天我們主要講的就是二叉搜...
資料結構(二叉搜尋樹)
二叉搜尋樹是一種可以高效完成以下操作的樹型的資料結構 插入乙個值 查詢是否含有某個值 刪除某個值 它儲存節點的資料資訊時,遵循以下規則,左子樹的值 根節點值 右子樹的值 下面是基本的二叉搜尋樹的實現 include include include includeusing namespace std...
資料結構 二叉搜尋樹
二叉搜尋樹的所有節點都滿足左子樹上的所有節點都比自己小,而右子樹上的所有節點都比自己大這一條件。當刪除某個節點時,需要根據下面幾種情況分別進行處理 需要刪除的節點沒有左兒子,那麼就把右兒子提上去。需要刪除的節點的左兒子沒有右兒子,那麼就把左兒子提上去。以上兩種情況都不滿足的話,就把左兒子的子孫 左子...