本文使用c++實現二叉搜尋樹(binary search tree,bst)資料結構。
一、為什麼要引入二叉搜尋樹
通過對向量和列表這兩類線性資料結構的原理分析,我們可以發現向量結構在對靜態查詢操作的支援比較好,有序向量的二分查詢能做到在o(logn)的時間,但是對刪除和插入操作在最壞情況下能達到o(n)的時間。而與向量相對立的列表結構能很好地支援動態操作,如刪除和插入只需要o(1)的時間,但是它對於靜態查詢操作的支援卻很差,如有序列表的查詢在最壞情況下也需要o(n)的時間。所以問題來了:若既要求物件集合的組成可以高效率地動態調整,同時也需要能夠高效率的查詢,則向量和列表結構都難以勝任。
若將二分查詢策略推廣到類似列表這種動態儲存的資料結構,就能既能保證靜態查詢操作的高效效能,也能保證動態增刪操作的高效效能。基於這種思想,將二分查詢策略進行抽象和推廣,可以定義並實現二叉搜尋樹結構。
二、二叉搜尋樹的特點
所謂的二叉搜尋樹,處處都滿足順序性:在任一節點r的左(右)子樹中,所有節點均不大於(不小於)r。
如上圖可見,任何一棵二叉樹是二叉搜尋樹,當且僅當其中序遍歷序列單調非降。
三、二叉搜尋樹的效能
因為二叉搜尋樹的結構融合了二分查詢的思想,所以可以通過二分查詢策略對指定值進行搜尋,對於深度為h的二叉搜尋樹,不難證明在最壞情況下的時間複雜度為o(h)。然而不幸的是,對於規模為n的二叉搜尋樹,深度在最壞的情況下能達到o(n),比如當樹退化為一條單鏈時,查詢的時間複雜度就和列表結構一樣為o(n)了。
由上可見,若要控制單次查詢在最壞情況下的執行時間,必須從二叉搜尋樹的高度入手,其實二叉搜尋樹本身沒有多麼實際的作用,它最大的貢獻是將二分查詢策略融合到樹結構中,這種樹結構使樹結構的查詢操作效率大大提公升。事實上,若能解決高度的問題,那麼二叉搜尋樹就能真正地使用了,這就是後面要介紹的平衡二叉樹,其具有很多的變種,可解決高度的問題。
四、二叉搜尋樹的實現
所以,二叉搜尋樹的實現最大的意義是為各種平衡二叉樹提供模板介面,主要包括查詢,插入和刪除操作。這裡通過構造bst類實現二叉搜尋樹資料結構,其由bintree類繼承而來,參見
bst介面列表 操作
功能物件
search(const t& e)
查詢指定元素,返回命中節點,並返回其父親節點
二叉搜尋樹
insert(const t& e)
按照二叉搜尋樹的結構要求插入指定元素
二叉搜尋樹
remove(const t& e)
按照二叉搜尋樹的結構要求刪除元素
二叉搜尋樹
(1) bst.h
#pragma once
#include"bintree.h"
//二叉搜尋樹模板類
templateclass bst :public bintree;
templatebinnode* & bst::searchin(binnode* &v, const t& e, binnode* &hot)
templatebinnode* & bst::search(const t& e)
//返回時,返回值指向命中節點或假想的哨兵節點,hot指向其parent
templatebinnode* bst::insert(const t& e)
templatebool bst::remove(const t& e)
else if(!(x->rc))
//case 2 :命中節點有兩個孩子,則通過succ找直接後繼節點
else
_hot = temp->parent;
if (succ)
succ->parent = _hot;
delete temp;
_size--;
updateheightabove(_hot);
return true;
}templatebinnode* bst::removeat(binnode* &x, binnode* &hot)
else if (!(x->rc))
//case 2 :命中節點有兩個孩子,則通過succ找直接後繼節點
else
hot = w->parent;
if (succ) succ->parent = hot;
delete w;
return succ;
}templatebinnode* bst::connect34( //按照3+4結構,聯接3個節點及4顆樹
binnode* a, binnode* b, binnode* c,
binnode* t0, binnode* t1, binnode* t2, binnode* t3)
templatebinnode* bst::rotateat(binnode* v)
else
}else //失衡是由節點插入造成的
else}}
資料結構 二叉搜尋樹 BST
一棵二叉搜尋樹具有如下特徵 節點的左子樹只包含小於當前節點的數 節點的右子樹只包含大於當前節點的數 所有左子樹和右子樹自身必須也是二叉搜尋樹 若輸出二叉搜尋樹的中序遍歷序列,則這個序列是非遞減 非遞增 有序的 圖1 節點有 a,b,c,d,e,f,g 葉子結點 d,e,f,g 其中結點a又被稱為根節...
資料結構 2 二叉搜尋樹(BST)
二叉搜尋樹 乙個節點的左子節點的關鍵字的值小於這個節點,右子節點的關鍵字的值大於或者等於這個父節點 在查詢過程中,用變數current來儲存正在檢視的節點,引數key是要查詢的值,查詢從root開始,因此開始把current設為根。之後,在while迴圈中,將要查詢的值,key與idata做比較。小...
資料結構 3二叉搜尋樹 BST
結構體node 左結點left 右結點right 資料data 類bst 根結點root 主要功能有 新增 刪除 查詢 遍歷 前序遍歷 中序遍歷 後序遍歷 層序遍歷 深度優先搜尋 廣度優先搜尋 高度計算 時間複雜度 1 新增 時間複雜度為o logn 2 刪除 時間複雜度為o logn 簡單描述一下...