資料結構 二叉搜尋樹

2021-09-27 13:38:53 字數 2702 閱讀 5513

簡介:

二叉查詢樹(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...

資料結構 二叉搜尋樹

二叉搜尋樹的所有節點都滿足左子樹上的所有節點都比自己小,而右子樹上的所有節點都比自己大這一條件。當刪除某個節點時,需要根據下面幾種情況分別進行處理 需要刪除的節點沒有左兒子,那麼就把右兒子提上去。需要刪除的節點的左兒子沒有右兒子,那麼就把左兒子提上去。以上兩種情況都不滿足的話,就把左兒子的子孫 左子...