七 資料結構 二叉搜尋樹 bst 的解析與實現

2021-09-02 22:00:06 字數 2780 閱讀 1324

本文使用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 簡單描述一下...