目錄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,指向當前二叉樹的根節點...