二叉树总结Word文档下载推荐.docx
《二叉树总结Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《二叉树总结Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
structBTNode*lchild,*rchild;
}btNode;
/**
*buildtree
*/
voidcreateTree(btNode*&
nodePtr){
charc;
cin>
>
c;
if(c!
='
0'
){
nodePtr=newbtNode();
nodePtr->
value=c;
createTree(nodePtr->
lchild);
rchild);
}
}
*Traversaltreeinlevelorder
voidlevelorder(btNode*nodePtr){
queue<
btNode*>
myqueue;
myqueue.push(nodePtr);
while(nodePtr){
cout<
<
nodePtr->
value<
"
"
;
if(nodePtr->
lchild){
myqueue.push(nodePtr->
}
rchild){
myqueue.pop();
nodePtr=myqueue.front();
while(!
myqueue.empty()){
myqueue.front()->
*Traversaltreeinpreorder
voidpreorder(btNode*nodePtr){
if(nodePtr!
=NULL){
endl;
preorder(nodePtr->
*Traversaltreeininorder
voidinorder(btNode*nodePtr,stringpreStr){
inorder(nodePtr->
lchild,preStr+"
);
(preStr+nodePtr->
value)<
rchild,preStr+"
*Traversaltreeinpostorder
voidpostorder(btNode*nodePtr){
postorder(nodePtr->
*countthenumberofleaf
voidleafcount(btNode*nodePtr,int&
count){
if(nodePtr){
lchild==NULL&
&
nodePtr->
rchild==NULL)count++;
leafcount(nodePtr->
lchild,count);
rchild,count);
*countthenumberofnode
voidnodecount(btNode*nodePtr,int&
count++;
nodecount(nodePtr->
*recordthedepthoftree
voidtreedepth(btNode*nodePtr,intlevel,int&
depth){
rchild==NULL)
if(level>
depth)depth=level;
treedepth(nodePtr->
lchild,level+1,depth);
rchild,level+1,depth);
}
*destroythetree
voiddestroytree(btNode*nodePtr){
destroytree(nodePtr->
Iamfree:
delete(nodePtr);
intmain(){
btNode*root;
//initrootandbuildtree
createTree(root);
//levelorder(root);
//preorder(root);
//inorder(root,"
//postorder(root);
//intcount=0;
//thenumberofleaf
//leafcount(root,count);
//cout<
Thenumberofleafis:
count<
//nodecount(root,count);
Thenumberofnodeis:
//intdepth=0;
//treedepth(root,0,depth);
Thedepthoftreeis:
depth<
destroytree(root);
return0;
创建二叉搜索树
1)添加节点
2)显示树
3)删除节点
4)各种工具函数
BSTTree.cpp
enumORDER_MODE
{
ORDER_MODE_PREV=0,
ORDER_MODE_MID,
ORDER_MODE_POST
};
template<
classT>
structBinaryNode
Telement;
BinaryNode*left;
BinaryNode*right;
BinaryNode(constT&
theElement,
BinaryNode*lt,
BinaryNode*rt):
element(theElement),
left(lt),
right(rt)
{
classBinarySearchTree
private:
BinaryNode<
T>
*m_root;
public:
BinarySearchTree();
BinarySearchTree(constBinarySearchTree&
rhs);
~BinarySearchTree();
constT&
findMin()const;
findMax()const;
boolcontains(constT&
x)const;
voidprintTree(ORDER_MODEeOrderMode=ORDER_MODE_PREV)const;
voidmakeEmpty();
voidinsert(constT&
x);
voidremove(constT&
//因为树的方法用到了很多递归,所以这里我们需要申明如下的私有成员函数
x,BinaryNode<
*&
t);
*findMin(BinaryNode<
*t)const;
*findMax(BinaryNode<
x,constBinaryNode<
voidmakeEmpty(BinaryNode<
t);
voidprintTreeInPrev(BinaryNode<
voidprintTreeInMid(BinaryNode<
*t)const;
voidprintTreeInPost(BinaryNode<
BinarySearchTree<
:
BinarySearchTree()
m_root=NULL;
rhs)
m_root=rhs.m_root;
~BinarySearchTree()
makeEmpty();
//returntrueifthexisfoundinthetree
boolBinarySearchTree<
contains(constT&
x)const
returncontains(x,m_root);
*t)const
if(!
t)
returnfalse;
elseif(x<
t->
element)
returncontains(x,t->
left);
elseif(x>
right);
else
returntrue;
//findtheminvalueinthetree
constT&
BinarySearchTree<
findMin()const
returnfindMin(m_root)->
element;
BinaryNode<
*BinarySearchTree<
findMin(BinaryNode<
//二叉树的一个特点就是左子叶的值比根节点小,右子叶的比根节点的大
returnNULL;
if(t->
left==NULL)
returnt;
returnfindMin(t->
//findthemaxvalueinthetree
findMax()const
returnfindMax(m_root)->
findMax(BinaryNode<
if(t!
=NULL)
while(t->
right!
t=t->
right;
returnt;
//insertanelementintotree
voidBinarySearchTree<
insert(constT&
x)
insert(x,m_root);
insert(constT&
t)
if(t==NULL)
t=newBinaryNode<
(x,NULL,NULL);
//注意这个指针参数是引用
insert(x,t->
;
//donothing
//removeaelementintatree
remove(constT&
returnremove(x,m_root);
return;
if(x<
remove(x,t->
remove(x,t->
else//now==
if(t->
left!
=NULL&
t->
=NULL)//twochild
{
element=findMin(t->
right)->
remove(t->
element,t->
else
BinaryNode<
*oldNode=t;
t=(t->
=NULL)?
left:
deleteoldNode;
makeEmpty()
makeEmpty(m_root);
makeEmpty(BinaryNode<
if(t)
makeEmpty(t->
deletet;
t=NULL;
//Printtree
printTree(ORDER_MODEeOrderMode/*=ORDER_MODE_PREV*/)const
if(ORDER_MODE_PREV==eOrderMode)
printTreeInPrev(m_root);
elseif(ORDER_MODE_MID==eOrderMode)
printTreeInMid(m_root);
elseif(ORDER_MODE_POST==eOrderMode)
printTreeInPost(m_root);
else
printTreeInPrev(BinaryNode<
cout<
printTreeInPrev(t->
printTreeInMid(BinaryNode<
printTreeInPost(BinaryNode<
printTreeInPost(t->
intmain(){
int>
bst;
bst.insert(5);
bst.insert(6);
bst.insert(7);
bst.insert(9);
bst.insert(4);
bst.printTree();
bst.remove(7);
二叉搜索树总结:
1.这里x最好声明为constT&
x,涉及到递归,值传递浪费空间,引用同时声明为常量
2.修改树的结构时一般都是引用,是不是在递归一般都这样呢?
?
3.remove的辅助函数findMin这里可以不用通过递归,所以可以不需要在public弄一个接口但是这里还是需要将其放到private中去,findMin目前不会单独作为一个功能提供给开发者,只是一个工具函数,放到private中去更合理
Ps:
还有老多不理解的地方,指针真难,后期跟进!
!