二叉搜尋樹又稱二叉排序樹。它或者是一棵空樹,或者是具有以下性質的二叉樹:
特性:任意節點都比其左子樹中所有節點大,比其右子樹中所有節點小
最左側節點一定是最小的,最右側節點一定是最大的
中序遍歷:可以得到乙個有序序列
二叉搜尋樹的查詢bstree.h二叉搜尋樹的插入
插入的具體過程如下:
a. 樹為空,則直接插入
b. 樹不空,按二叉搜尋樹性質查詢插入位置,插入新節點
二叉搜尋樹的刪除 首先查詢元素是否在二叉搜尋樹中,如果不存在,則返回, 否則要刪除的結點可能分下面四種情況:
a. 要刪除的結點無孩子結點
b. 要刪除的結點只有左孩子結點
c. 要刪除的結點只有右孩子結點
d. 要刪除的結點有左、右孩子結點
看起來有待刪除節點有4中情況,實際情況a可以與情況b或者c合併起來,因此真正的刪除過程如下:
情況b:刪除該結點且使被刪除節點的雙親結點指向被刪除節點的左孩子結點
情況c:刪除該結點且使被刪除節點的雙親結點指向被刪除結點的右孩子結點
情況d:在它的右子樹中尋找中序下的第乙個結點(關鍵碼最小),用它的值填補到被刪除節點中,再來處理該結點的刪除問題
#include
using
namespace std;
template
<
class
t>
//構建二叉樹節點類模板
struct bstnode
bstnode
* left;
bstnode
* right;
t data;};
template
<
class
t>
//構建二叉搜尋樹及其方法
class
bstree
~bstree()
node*
find
(const t& data)
//查詢乙個數
return
nullptr;}
bool
insert
(const t& data)
//插入乙個資料
// 非空
// 1.找待插入元素在樹中的位置,並儲存其雙親
else
//2.插入新節點
cur =
newnode
(data);if
(data < parent-
>data)
parent-
>left = cur;
else
parent-
>right = cur;
return
true;}
}void
inorder()
bool
erase
(const t& data)
//刪除乙個數
else
}//如果樹中沒有待刪除元素的對應節點if(
nullptr
== cur)
return
false
;//2.已經找到待刪除元素的位置,之後進行刪除if(
nullptr
== cur-
>left)
// cur只有右孩子或者cur是葉子節點
else
}elseif(
nullptr
== cur-
>right)
//cur只有左孩子或者cur是葉子節點
else
}else
//2.將替代節點的值域交給待刪除節點
cur-
>data = del-
>data;
//3.刪除待刪除結點
if(del == parent-
>left)
parent-
>left = del-
>right;
else
parent-
>right = del-
>right;
cur = del;
}delete cur;
return
true;}
private
:void
_inorder
(node* proot)
//中序遍歷
資料結構之二叉搜尋樹
什麼是二叉搜尋樹呢?它與別的資料結構相比其優勢又是什麼呢?一顆二叉搜尋樹就是以一顆二叉樹來組織和儲存資料的,如圖所示 圖a是包含6個節點 高度為2的二叉樹,圖b是包含相同關鍵字 高度為4的低效二叉樹 對比博文前面所介紹的鍊錶,二叉樹也是可以用結構體來實現,只不過每個節點裡面不僅要儲存資料本身的關鍵字...
二叉搜尋樹c 資料結構二叉搜尋樹
在n個動態的整數中搜尋某個整數?檢視其是否存在 假設使用動態陣列存放元素,從第 0 個位置開始遍歷搜尋,平均時間複雜度 o n 如果維護乙個有序的動態陣列,使用二分搜尋,最壞時間複雜度 o logn 但是新增 刪除的平均時間複雜度是 o n 針對這個需求,有沒有更好的方案?今天我們主要講的就是二叉搜...
資料結構與演算法之二叉搜尋樹
看到有個傢伙寫的很好 二叉查詢樹 二 之 c 的實現 二叉搜尋樹的定義 一棵二叉樹,可能為空 一棵非空的二叉搜尋樹滿足以下特徵 每個元素有乙個關鍵字,並且任意兩個元素的關鍵字都不同,因此,所有的關鍵字都是唯一的。在根節點的左子樹中,元素的關鍵字 如果有的話 都小於根節點的關鍵字。在根節點的右子樹中,...