二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹::
定義二叉搜尋樹的結點:
template
<
class
t>
struct bstreenode
};
二叉搜尋樹定義:
template
<
class
t>
class
bstree
;
a. 樹為空,則直接插入
if
(nullptr
== _proot )
b. 樹不空,按二叉搜尋樹性質查詢插入位置,插入新節點
//找當前結點在二叉搜尋樹中的位置
node* pcur = _proot;
node* pparent =
nullptr
;while
(pcur)
//插入結點
首先查詢元素是否在二叉搜尋樹中,如果不存在,則返回。
//找到要刪除結點,及記錄要刪除的父親結點
node* pcur = _proot;
node* pparent =
nullptr
;while
(pcur)
else
if(data > pcur-
>_data)
else
}//沒找到則返回if(
nullptr
== pcur)
然後要刪除的結點可能分下面四種情況:
a. 要刪除的結點無孩子結點
b. 要刪除的結點只有左孩子結點
c. 要刪除的結點只有右孩子結點
d. 要刪除的結點有左、右孩子結點
看起來有待刪除節點有4中情況,實際情況a可以與情況b或者c合併起來,因此真正的刪除過程如下:
情況b:刪除該結點且使被刪除節點的雙親結點指向被刪除節點的左孩子結點(注:要判斷要刪除結點是否為根結點,還要判斷刪除結點是父親結點的左孩子還是右孩子)
//只有左孩子if(
nullptr
== pcur-
>_pright)
else
delete pcur;
}
情況c:刪除該結點且使被刪除節點的雙親結點指向被刪除結點的右孩子結點(注:要判斷要刪除結點是否為根結點,還要判斷刪除結點是父親結點的左孩子還是右孩子)
//只有右孩子
elseif(
nullptr
== pcur-
>_pleft)
else
delete pcur;
}
情況d:在它的右子樹中尋找中序下的第乙個結點(關鍵碼最小),用它的值填補到被刪除節點中,再來處理該結點的刪除問題
找到替刪結點(真正要刪除的結點),可以刪除左子樹最右(大)結點,也可以刪除右子樹最左(小)結點,以刪除右子樹最左結點為例
//在右子樹找替代將刪除的替代結點
node* pdel = pcur-
>_pright;
pparent = pcur;
while
(pdel-
>_pleft)
把替刪結點的資料賦給目標刪除結點
//將替代結點的值--->待刪除的結點
pcur-
>_data = pdel-
>_data;
刪除替刪結點
①替刪結點是父親結點的左孩子(因為替刪結點已經最左,只要把替刪結點的右孩子接到父親結點即可)
②替刪結點是父親結點的右孩子(可能要刪除的右子樹沒有最左,替刪結點是目標結點的右孩子)
//如果替代結點是父節點的左孩子,因為替代結點已經最左不會有左孩子,直接把右孩子接到父節點即可
if(pdel == pparent-
>_pleft)
pparent-
>_pleft = pdel-
>_pright;
else
//替代結點是父節點的右孩子(替代結點就是要刪除結點的右孩子)
pparent-
>_pright = pdel-
>_pright;
delete pdel;
二叉搜尋樹c 資料結構二叉搜尋樹
在n個動態的整數中搜尋某個整數?檢視其是否存在 假設使用動態陣列存放元素,從第 0 個位置開始遍歷搜尋,平均時間複雜度 o n 如果維護乙個有序的動態陣列,使用二分搜尋,最壞時間複雜度 o logn 但是新增 刪除的平均時間複雜度是 o n 針對這個需求,有沒有更好的方案?今天我們主要講的就是二叉搜...
資料結構(二叉搜尋樹)
二叉搜尋樹是一種可以高效完成以下操作的樹型的資料結構 插入乙個值 查詢是否含有某個值 刪除某個值 它儲存節點的資料資訊時,遵循以下規則,左子樹的值 根節點值 右子樹的值 下面是基本的二叉搜尋樹的實現 include include include includeusing namespace std...
資料結構 二叉搜尋樹
二叉搜尋樹的所有節點都滿足左子樹上的所有節點都比自己小,而右子樹上的所有節點都比自己大這一條件。當刪除某個節點時,需要根據下面幾種情況分別進行處理 需要刪除的節點沒有左兒子,那麼就把右兒子提上去。需要刪除的節點的左兒子沒有右兒子,那麼就把左兒子提上去。以上兩種情況都不滿足的話,就把左兒子的子孫 左子...