更多:2011年軟考程序員考試復(fù)習(xí)筆試知識(shí)點(diǎn)整理匯總
23、二叉排序樹(shù)(BST, Binary SortTree) 的C++實(shí)現(xiàn)
二叉排序樹(shù)(Binary Sort Tree)又稱二叉查找(搜索)樹(shù)(Binary Search Tree)。
(1)二叉排序樹(shù)定義:二叉排序樹(shù)或者是空樹(shù),或者是滿足如下性質(zhì)的二叉樹(shù):
、偃羲淖笞訕(shù)非空,則左子樹(shù)上所有結(jié)點(diǎn)的值均小于根結(jié)點(diǎn)的值;
②若它的右子樹(shù)非空,則右子樹(shù)上所有結(jié)點(diǎn)的值均大于根結(jié)點(diǎn)的值;
③左、右子樹(shù)本身又各是一棵二叉排序樹(shù)。
上述性質(zhì)簡(jiǎn)稱二叉排序樹(shù)性質(zhì)(BST性質(zhì)),故二叉排序樹(shù)實(shí)際上是滿足BST性質(zhì)的二叉樹(shù)。
(2)二叉排序樹(shù)的特點(diǎn)
由BST性質(zhì)可得:
[1]二叉排序樹(shù)中任一結(jié)點(diǎn)x,其左(右)子樹(shù)中任一結(jié)點(diǎn)y(若存在)的關(guān)鍵字必小(大)于x的關(guān)鍵字。
[2]二叉排序樹(shù)中,各結(jié)點(diǎn)關(guān)鍵字是惟一的。 注意:實(shí)際應(yīng)用中,不能保證被查找的數(shù)據(jù)集中各元素的關(guān)鍵字互不相同,所以可將二叉排序樹(shù)定義中BST性質(zhì)[1]里的"小于"改為"小于等于",或?qū)ST性質(zhì)[2]里的"大于"改為"大于等于",甚至可同時(shí)修改這兩個(gè)性質(zhì)。
[3]按中序遍歷該樹(shù)所得到的中序序列是一個(gè)遞增有序序列。
(3)在二叉排序樹(shù)上進(jìn)行查找時(shí)的平均查找長(zhǎng)度和二叉樹(shù)的形態(tài)有關(guān):
、僭谧顗那闆r下,二叉排序樹(shù)是通過(guò)把一個(gè)有序表的n個(gè)結(jié)點(diǎn)依次插入而生成的,此時(shí)所得的二叉排序樹(shù)蛻化為棵深度為n的單支樹(shù),它的平均查找長(zhǎng)度和單鏈表上的順序查找相同,亦是(n+1)/2。
、谠谧詈们闆r下,二叉排序樹(shù)在生成的過(guò)程中,樹(shù)的形態(tài)比較勻稱,最終得到的是一棵形態(tài)與二分查找的判定樹(shù)相似的二叉排序樹(shù),此時(shí)它的平均查找長(zhǎng)度大約是lgn。
③插入、刪除和查找算法的時(shí)間復(fù)雜度均為O(lgn)。
(4)二叉排序樹(shù)和二分查找的比較
就平均時(shí)間性能而言,二叉排序樹(shù)上的查找和二分查找差不多。
就維護(hù)表的有序性而言,二叉排序樹(shù)無(wú)須移動(dòng)結(jié)點(diǎn),只需修改指針即可完成插入和刪除操作,且其平均的執(zhí)行時(shí)間均為O(lgn),因此更有效。二分查找所涉及的有序表是一個(gè)向量,若有插入和刪除結(jié)點(diǎn)的操作,則維護(hù)表的有序性所花的代價(jià)是O(n)。當(dāng)有序表是靜態(tài)查找表時(shí),宜用向量作為其存儲(chǔ)結(jié)構(gòu),而采用二分查找實(shí)現(xiàn)其查找操作;若有序表里動(dòng)態(tài)查找表,則應(yīng)選擇二叉排序樹(shù)作為其存儲(chǔ)結(jié)構(gòu)。
//二叉查找樹(shù)代碼
//BTreeNode.h二叉樹(shù)結(jié)點(diǎn)抽象類型
#ifndefBTREENODE_H
#defineBTREENODE_H
#include
//template
template
template
{
//friend class BTree
friend class SortBTree
public:
BTreeNode():lchild(NULL),rchild(NULL){ };
BTreeNode(const T&dt,BTreeNode
:data(dt),lchild(lch),rchild(rch){};
T get_data()const {return data; };
BTreeNode
BTreeNode
void set_data(const T& d) { data =d;};
protected:
private:
T data;
BTreeNode
};
#endif
/************************************************************************
*SortBTree.h
* 根據(jù)給定的字符串構(gòu)造一個(gè)排序二叉樹(shù)
* 從排序二叉樹(shù)中尋找最大值,最小值,不存在時(shí)拋出invalid_argument異常
* 從排序二叉樹(shù)中刪除某一元素,不存在時(shí)拋出invalid_argument 異常
* 往排序二叉樹(shù)中添加一個(gè)新元素
************************************************************************/
相關(guān)推薦:北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |