通用演算法 樹結構 二叉搜尋樹

2021-09-29 16:46:06 字數 3071 閱讀 2688

二叉搜尋樹,又稱二叉排序數或二叉查詢樹。

它要麼一棵空樹,要麼具有如下性質:

(1)若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值;

(2)若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值;

(3)它的左右子樹也分別為二叉排序樹;

下圖就是一棵二叉搜尋樹

二叉排序樹具有如下優點:

二叉搜尋樹儲存方式和普通二叉樹一樣,有兩種儲存方式,一種是順序儲存,一種是鏈式儲存。

(1)順序儲存

二叉樹的順序儲存,就是用一組連續的儲存單元存放二叉樹中的結點。因此,必須把二叉樹的所有結點安排成為乙個恰當的序列,結點在這個序列中的相互位置能反映出結點之間的邏輯關係,用編號的方法從樹根起,自上層至下層,每層自左至右地給所有結點編號。

缺點是有可能對儲存空間造成極大的浪費,在最壞的情況下,乙個深度為k

kk且只有k

kk個結點的右單支樹需要2k−

12^-1

2k−1

個結點儲存空間。

依據二叉樹的性質,完全二叉樹和滿二叉樹採用順序儲存比較合適,樹中結點的序號可以唯一地反映出結點之間的邏輯關係,這樣既能夠最大可能地節省儲存空間,又可以利用陣列元素的下標值確定結點在二叉樹中的位置,以及結點之間的關係。

如圖所示:

圖1 完全二叉樹使用順序儲存結構儲存。

圖2 非完全二叉樹改造成完全二叉樹後的儲存示意圖。

(2)鏈式儲存結構

二叉樹的鏈式儲存結構是指,用鍊錶來表示一棵二叉樹,即用鏈來指示元素的邏輯關係。

通常的方法是鍊錶中每個結點由三個域組成,資料域和左右指標域,左右指標分別用來給出該結點左孩子和右孩子所在的鏈結點的儲存位址。其結點結構為:

其中,data域存放某結點的資料資訊;lchild與rchild分別存放指向左孩子和右孩子的指標,當左孩子或右孩子不存在時,相應指標域值為空(用符號∧或null表示)。利用這樣的結點結構表示的二叉樹的鏈式儲存結構被稱為二叉鍊錶,如圖3所示。

圖3 二叉樹的二叉鍊錶表示示意圖

實現**:

struct binarytreenode};

//二叉搜尋樹中的遞迴查詢

bool

search_recursion

(binarytreenode* root,

int val)

if(root-

>value == val)

else

if(root-

>value > val)

else

}//二叉搜尋樹中的非遞迴查詢

bool

search

(binarytreenode* root,

int val)

else

if(p-

>value > val)

else

}return

false

;}

實現**:

//二叉搜尋樹的遞迴插入操作

binarytreenode*

insert_recursion

(binarytreenode* root,

int node_value)

/*if (root->value == node_value)*/

if(root-

>value > node_value)

else

if(root-

>value < node_value)

return root;

}binarytreenode*

insert

(binarytreenode* root,

int node_value)

*/if

(iter-

>value > node_value)

else

if(iter-

>value < node_value)

} binarytreenode* node =

newbinarytreenode

(node_value);if

(enter ==-1

)else

if(enter ==0)

else

return root;

}

實現**:

//在二叉搜尋樹中找到最大節點

binarytreenode*

findmax

(binarytreenode* root)

return iter;

}//在二叉搜尋樹中找到最小節點

binarytreenode*

findmin

(binarytreenode* root)

return iter;

}binarytreenode*

remove

(binarytreenode* root,

int remove_value)

//找到要刪除的節點

if(root-

>value == remove_value)

else

else

if(root-

>right ==

nullptr

)//釋放待刪除節點所佔的空間

delete temp;}}

else

if(root-

>value < remove_value)

else

return root;

}

樹結構 二叉樹

二叉樹 如果書中的每個節點最多只有兩個子節點,這樣的樹就叫做二叉樹 1.二叉樹的重要特性 二叉樹第 i 層的最大節點數為 2 i 1 i 1 深度為 k 的二叉樹最大節點總數為 2 k 1 對於任何乙個非空二叉樹t,若n0表示葉節點的個數,n2為度為2的非空葉節點個數,那麼兩者滿足 n0 n2 1 ...

熟悉樹結構 二叉樹

2.二叉樹的性質 3.二叉樹的儲存結構 二叉樹是一種典型的樹形結構 二叉樹的特點是每個結點至多有兩棵子樹,即二叉樹的度 是2,並且二叉樹的子樹有左右之分,不可任意顛倒次序 結點個數為0的二叉樹 一棵深度為k,且有2 k 1個結點的二叉樹,稱為滿二叉樹。特點是每一層上的結點數都是最大結點數。在一棵二叉...

二叉搜尋樹 二叉搜尋樹

題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...