資料結構與演算法之二叉查詢樹

2022-06-26 17:27:11 字數 2685 閱讀 9192

對一般容器的查詢, 我們可以按順序遍歷, 找到符合要求的元素就返回; 對於元素是有序的容器, 可以使用二分查詢等方法查詢, 減少操作的時間複雜度.

容易知道, 一般查詢的平均時間複雜度是o(n), 二分查詢的平均時間複雜度是o(logn).

什麼是二叉查詢樹?

根結點的左子樹的結點都小(大)於根結點, 根結點的右子樹的結點都大(小)於根結點;

你也可能聽過二叉排序樹,二叉排序樹就是二叉查詢樹, 名字不同罷了.

二叉查詢樹是怎麼排序的呢? 我們可以想象一顆二叉查詢樹, 最左邊的結點最小, 最右邊的結點最大, 對每個子樹這個結論也成立. 所以,

二叉查詢樹的中序遍歷就是排序操作.

如上二叉查詢樹, 中序遍歷的結果是

1, 2, 3, 4, 5, 6, 7, 8, 9
根據二叉查詢樹的定義, 左子樹的結點都小於根結點, 右子樹的結點都大於根結點.

對於輸入待查詢的乙個結點, 我們可以先與根結點比較, 如果小於, 則繼續遞迴左子樹, 如果大於, 則繼續遞迴右子樹, 直到找到匹配的結點.

nodetree *bsearch(nodetree *root, const int &val)

if (val == root->val)

if (val < root->val)

if (val > root->val)

}

構建一顆二叉查詢樹也就是不停地執行二叉查詢樹的插入操作, 要保證插入之後的二叉樹還是二叉查詢樹.

二叉樹的插入操作就是其查詢操作的高階版本.

對需要插入的元素, 與根結點比較, 如果小於則對左子樹遞迴, 如果大於則對右子樹遞迴, 直到最終的葉子結點;

如果比葉子結點小, 則作為葉子結點的左子結點, 如果比葉子結點大, 則作為葉子結點的右子結點.

比如說插入元素6, 則按照加粗標記的箭頭插入. 最終遍歷到結點5時, 發現是葉子結點, 且6比5大, 則6作為5的右子結點插入.

對二叉查詢樹的刪除可以分類討論.

對於沒有子結點和只有乙個子結點的刪除操作, 可以參考這個圖

如果被刪除的結點沒有子結點, 即是葉子結點, 則直接將葉子結點的父結點指向該葉子結點的指標置空就行.

偽**如下:

node->parent->left == node ? (node->parent->left = nullptr) : (node->parent->right = nullptr);

delete node;

如果被刪除的結點只有乙個子結點, 則將該結點的父結點指向該結點的指標重新指向該結點的子結點即可.

偽**如下:

node->parent->left == node ? (node->parent->left = node->left) : (node->parent->right = node->right);

delete node;

如果被刪除的結點有兩個子結點, 則情況稍微複雜一點, 我們可以看乙個特例, 被刪除的結點是根結點. (不是根結點也是子樹的根結點)

我們需要刪除結點3, 怎麼操作?

根據二叉查詢樹的定義, 我們可以知道:

二叉查詢樹的最左邊結點是最小的結點;

二叉查詢樹的最右邊結點是最大的結點;

所以, 又有下面兩個結論:

左子樹的最右邊結點是左子樹的最大結點;

右子樹的最左邊結點是右子樹的最小結點;

所以, 我們有兩種方案刪除有兩個子結點的結點;

用左子樹的最右邊結點替換被刪除結點, 這時候被替換的結點依然滿足左子樹的結點都小於它, 右子樹的結點都大於它;

用右子樹的最左邊結點替換被刪除結點, 這時候被替換的結點依然滿足左子樹的結點都小於它, 右子樹的結點都大於它;

所以偽**可以是:

bool is_rl = false;              //判斷是否是左子樹根結點

nodetree *rl_node = node->right; //右子樹

while (rl_node->left) //右子樹最左邊

rl_node->left = node->left;

if (is_rl)

delete node;

資料結構查詢演算法之二叉查詢樹

關於二叉查詢樹,介紹肯定是很多的,這裡我列舉的下面的 和思想,是按照二叉查詢樹,但是沒有使用二叉樹的資料結構,而是按照陣列索引建立邏輯上的二叉樹結構,並使用二叉樹的遞迴方式查詢給定的值,並在注釋中對不同的情況提出一點自己的看法,建立樹的過程參考堆排序的思想,並且在結構上大致相同,所以需要注意的地方也...

資料結構與演算法之二叉樹查詢

二叉樹 查詢指定節點 要求1 請編寫前序查詢,中序查詢和後序查詢的方法。2 並分別使用三種查詢方式,查詢 herono 5 的節點 3 並分析各種查詢方式,分別比較了多少次 思路分析 實現 public class treedemo class binarytree 前序遞迴遍歷 public vo...

資料結構之二叉查詢樹

針對二叉查詢樹的操作 增刪改查 的時間和樹的高度成正比,比如都有10個節點的乙個樹,樹高為4和樹高為10的操作時間肯定是不同的,這個時間實際上是o lgn 二叉查詢樹的期望的樹高是lgn,從而基本動態集合的操作平均時間為 lgn 通常二叉查詢樹基於鍊錶實現,每個節點儲存左,右子節點,如果想更方便的實...