二叉查詢樹(BST) 樹

2022-08-28 16:03:23 字數 2755 閱讀 3455

目錄1,定義

二叉查詢樹(binary search tree),又名二叉搜尋樹或二叉排序樹。可以是一顆空樹,或者是具有下列性質的二叉樹:

(1)若它的左子樹不空,則左子樹上所有結點的指均小於它的根結點的值;

(2)若它的右子樹不空,則右子樹上所有結點的指均大於它的根結點的值;

2,c++實現二叉樹的基本操作

#include#include#includeusing namespace std;

/*bst樹的結點型別*/

template struct bstnode

//t data=t():0的初始化

t mdata;

bstnode*mleft;

bstnode*mright;

};templateclass bstree

~bstree(){}

/*向bst樹中插入資料:

過程為:

若b是空樹,則將val所指結點作為根結點插入,否則:

若val等於b的根結點的資料域之值,則返回,否則:

若val小於b的根結點的資料域之值,則把val所指結點插入到左子樹中,否則:

把val所指結點插入到右子樹中

*/void insert(const t&val)

bstnode*ppre=mroot;

bstnode*pcur=mroot;

while(pcur!=null)

else if(val>pcur->mdata)

else

}if(valmdata)

else

}/*bst樹的結點刪除

在二叉排序樹刪去乙個結點,分三種情況討論:

若*p結點為葉子結點,即pl(左子樹)和pr(右子樹)均為空樹。由於刪去葉子結點不破壞整棵樹的結構,則只需修改其雙親結點的指標即可。

若*p結點只有左子樹pl或右子樹pr,此時只要令pl或pr直接成為其雙親結點*f的左子樹或右子樹即可,作此修改也不破壞二叉排序樹的特性。

若*p結點的左子樹和右子樹均不空。在刪去*p之後,為保持其它元素之間的相對位置不變,可按中序遍歷保持有序進行調整,可以有兩種做法:其一是令*p的左子樹為*f的左子樹,*s為*f左子樹的最右下的結點,而*p的右子樹為*s的右子樹;其二是令*p的直接前驅(或直接後繼)替代*p,然後再從二叉排序樹中刪去它的直接前驅(或直接後繼)。在二叉排序樹上刪除乙個結點的演算法如下:

*/void remove(const t&val)

bstnode*ppre=null;

bstnode*pcur=mroot;

while(pcur!=null)

else if(val>pcur->mdata)

else

}if(pcur==null)

if(pcur->mleft!=null&&pcur->mright!=null)

//pdel為待刪除的結點

pcur->mdata=pdel->mdata;

pcur=pdel;

}//開始刪除結點,記錄當前待刪除結點的自孩子

bstnode*pchild=null;

if(pcur->mleft!=null)

else if(pcur->mright!=null)

//pcur 開始刪除操作

if(ppre==null)

else if(pcur->mdata<=ppre->mdata)

else

delete pcur;

}/*bst樹的查詢*/

bool query(const t&val)

else if(val>pcur->mdta)

else

}return false;

}/*層序遍歷*/

void level()

if(pcur->mright!=null)

que.pop();

}coutstack;

bstnode*pcur=mroot;

while(pcur!=null||!stack.empty())

if(!stack.empty())

}coutstack1;

bstnode*pcur=mroot->mleft;

stack1.push(mroot);

while(pcur!=null||!stack1.empty())

pcur=stack1.top();

stack1.pop();

cout

pcur=pcur->mright;

}coutstack2;

bstnode*pcur=null;

bstnode*pcur=mroot;

while(pcur!=null||!stack2.empty())

pcur=stack2.top();

if(pcur->mright==null||pcur->mright=ppre)

else

pcur=pcur->mright;

}cout

void preorder(bstnode*pnode)

}void inorder(bstnode*pnode1)

}void lastorder(bstnode*pnode2)}}

函式實現:

int main()

結果:

二叉查詢樹 BST

當所有的靜態查詢結構新增和刪除乙個資料的時候,整個結構都需要重建。這對於常常需要在查詢過程中動態改變資料而言,是災難性的。因此人們就必須去尋找高效的動態查詢結構,我們在這討論乙個非常常用的動態查詢樹 二叉查詢樹。二叉查詢樹的特點 下面的圖就是兩棵二叉查詢樹,我們可以總結一下他的特點 1 若它的左子樹...

二叉查詢樹(BST)

二叉查詢樹,也稱為二叉排序樹,二叉搜尋樹。二叉查詢樹結合了鍊錶插入的靈活性和有序陣列查詢 二分查詢 的高效性。用二叉查詢樹實現有序符號表的api。public class bst,value 有序符號表的相關方法 public intsize private intsize node x publi...

二叉查詢樹BST

樹由node物件組成,每個物件有一對鍵值 兩條鏈結和乙個節點計數器n。每個node物件都是一棵含有n個節點的子樹的根節點,它的左鏈結指向一棵由小於該節點的所有鍵組成的二叉查詢樹,右鏈結指向一棵由大於該節點的所有鍵組成的二叉查詢樹。在bst類中,還應定義乙個node物件root,指向當前二叉樹的根節點...