上述條件反之亦可接近二分查詢,最大查詢次數為樹的高度,平均查詢次數log2 n
template
<
class
t>
struct bstnode};
template
<
class
t>
class
bstree
else
if(cur-
>_val < val)
else
if(cur-
>_val > val)
}return
nullptr;}
private
: node* _root =
nullptr;}
;
如果樹中已存在需要插入的資料,則不重複插入
插入位置為:葉子,子樹不完全的非葉子結點,即度為0或者1的節點位置
bool
insert
(const t& val)
node* cur = _root;
node* parent =
nullptr
;while
(cur)
cur =
newnode
(val);if
(parent-
>_val < val)
parent-
>_right = node;
else
parent-
>_left = cur;
return
true
;}
有以下四種情況
a. 要刪除的結點無孩子結點
b. 要刪除的結點只有左孩子結點
c. 要刪除的結點只有右孩子結點
d. 要刪除的結點有左、右孩子結點
刪除度為2的節點:
找到此節點中,左子樹的最右節點或者右子樹的最左節點
要刪除的節點val替換為最左節點或者最右節點
真正要刪除的是最左或者最右節點
此時問題轉換為刪除度為0或者度為1的節點
bool
erase
(const t& val)
else
if(cur-
>_val < val)
else
}//判斷是否找到需要刪除的節點
if(cur ==
nullptr
)return
false
;//刪除操作
//1. 葉子
if(cur-
>_left ==
nullptr
&& cur-
>_right ==
nullptr
)else
delete cur;
}//2.左孩子為空
else
if(cur-
>_left ==
nullptr
)delete cur;
}//3.右孩子為空
else
if(cur-
>_right ==
nullptr
)delete cur;
}//4.左右孩子都存在
else
//b.值替換
cur-
>_val = leftmostchild-
>_val;
//c.刪除最左或最右節點
if(parent-
>_left == leftmostchild)
parent-
>_left = leftmostchild-
>_right;
else
parent-
>_right = leftmostchild-
>_right;
delete leftmostchild;
}}
二叉搜尋樹的簡單實現
查詢是否有某個元素,找到返回true,找不到返回false public boolean contains int key else if key else return false 插入某元素,如果已經包含該元素則返回false,插入成功就返回true public boolean insert ...
二叉搜尋樹的簡單實現
二叉搜尋樹又稱二叉排序樹,它或者是一棵空樹,或者是具有以下性質的二叉樹 1.若它的左子樹不為空,則左子樹上所有節點的值都小於根節點的值 2.若它的右子樹不為空,則右子樹上所有節點的值都大於根節點的值 3.它的左右子樹也分別為二叉搜尋樹 pragma once templatestruct bstre...
bst 二叉搜尋樹簡單實現
陣列實現二叉樹 1.下標為零的元素為根節點,沒有父節點 2.節點i的左兒子是2 i 1 右兒子2 i 2 父節點 i 1 2 3.下標i為奇數則該節點有有兄弟,否則又左兄弟 4.對bst樹的操作主要有插入,刪除,後繼前驅的查詢,樹最大最小節點檢視 include using namespace st...