C++ Exercises(十六)--二叉树的简单实现

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#include"stdafx.h"
#include
<iostream>
#include
<stack>
#include
"BinSTree.h"
#include
<queue>
usingnamespacestd;

classCTreeNode
ExpandedBlockStart.gifContractedBlock.gif
{//树节点类
public:
CTreeNode(
constint&item,CTreeNode*lptr=NULL,CTreeNode*rptr=NULL):data(item),left(lptr),right(rptr)
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
}

CTreeNode
*Left(void)
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
returnleft;
}

CTreeNode
*Right(void)
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
returnright;
}

friend
classCBinSTree;
public:
intdata;
private:
CTreeNode
*left;
CTreeNode
*right;

}
;

ExpandedBlockStart.gifContractedBlock.giftypedef
enum{LEFT,RIGHT}TagType;//伪节点类型
structProTreeNode
ExpandedBlockStart.gifContractedBlock.gif
{//用于后序遍历的伪节点
CTreeNode*node;
TagTypetype;
}
;
CTreeNode
*GetTreeNode(constint&item,CTreeNode*lptr=NULL,CTreeNode*rptr=NULL)
ExpandedBlockStart.gifContractedBlock.gif
{
CTreeNode
*p;
p
=newCTreeNode(item,lptr,rptr);
if(p==NULL)
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
cerr
<<"分配内存失败!"<<endl;
exit(
1);
}

returnp;
}


voidFreeTreeNode(CTreeNode*p)
ExpandedBlockStart.gifContractedBlock.gif
{
deletep;
p
=NULL;
}


voidInOrder(CTreeNode*t)
ExpandedBlockStart.gifContractedBlock.gif
{//中序遍历
stack<CTreeNode*>s;
CTreeNode
*p=t;
while(p!=NULL||!s.empty())
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
while(p!=NULL)//遍历左子树
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
s.push(p);
p
=p->Left();
}
//endwhile

if(!s.empty())
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
p
=s.top();
s.pop();
cout
<<p->data<<endl;//访问根结点
p=p->Right();//通过下一次循环实现右子树遍历
}
//endif

}
//endwhile
}


voidPreOrder(CTreeNode*t)
ExpandedBlockStart.gifContractedBlock.gif
{//前序遍历
stack<CTreeNode*>s;
CTreeNode
*p=t;
while(p!=NULL||!s.empty())
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
while(p!=NULL)//遍历左子树
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
cout
<<p->data<<endl;
s.push(p);
p
=p->Left();
}
//endwhile

if(!s.empty())
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
p
=s.top();
s.pop();
p
=p->Right();//通过下一次循环实现右子树遍历
}
//endif

}
//endwhile
}


voidPostOrder(CTreeNode*t)
ExpandedBlockStart.gifContractedBlock.gif
{//后序遍历
stack<ProTreeNode>s;
CTreeNode
*p=t;
ProTreeNodex;
do
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
while(p!=NULL)//遍历左子树
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
x.node
=p;
x.type
=LEFT;//标记为左子树
s.push(x);
p
=p->Left();
}


while(!s.empty()&&s.top().type==RIGHT)
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
x
=s.top();
s.pop();
p
=x.node;
cout
<<p->data<<endl;//type为RIGHT,表示右子树访问完毕,故访问根结点
}


if(!s.empty())
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
s.top().type
=RIGHT;//遍历右子树
p=s.top().node->Right();
}

}
while(!s.empty());
}

CTreeNode
*MakeSampleTree()
ExpandedBlockStart.gifContractedBlock.gif
{
CTreeNode
*root,*node2,*node3,*node4,*node5;
node4
=GetTreeNode(4);
node2
=GetTreeNode(2,NULL,node4);
node5
=GetTreeNode(5);
node3
=GetTreeNode(3,node5);
root
=GetTreeNode(1,node2,node3);
returnroot;
}


voidDeleteTree(CTreeNode*t)
ExpandedBlockStart.gifContractedBlock.gif
{
if(t!=NULL)
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
DeleteTree(t
->Left());
DeleteTree(t
->Right());
FreeTreeNode(t);
}

}


voidClearSampleTree(CTreeNode*t)
ExpandedBlockStart.gifContractedBlock.gif
{
DeleteTree(t);
t
=NULL;
}



voidCountLeaf(CTreeNode*t,int&count)
ExpandedBlockStart.gifContractedBlock.gif
{
if(t!=NULL)
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
CountLeaf(t
->Left(),count);
CountLeaf(t
->Right(),count);
if(t->Left()==NULL&&t->Right()==NULL)
count
++;
}

}


intDepth(CTreeNode*t)
ExpandedBlockStart.gifContractedBlock.gif
{
intdepLeft,depRight,depRtv;
if(t==NULL)
depRtv
=0;
else
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
depLeft
=Depth(t->Left());
depRight
=Depth(t->Right());
depRtv
=max(depLeft,depRight)+1;
}

returndepRtv;

}


voidIndentBlanks(intnum)
ExpandedBlockStart.gifContractedBlock.gif
{
for(inti=0;i<num;++i)
cout
<<"";
}

constintINDENTBLANKS=6;
voidPrintTree(CTreeNode*t,intlevel)
ExpandedBlockStart.gifContractedBlock.gif
{//逆时针旋转'打印树
if(t!=NULL)
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
PrintTree(t
->Right(),level+1);
IndentBlanks(level
*INDENTBLANKS);
cout
<<t->data<<endl;
PrintTree(t
->Left(),level+1);
}

}


CTreeNode
*CopyTree(CTreeNode*t)
ExpandedBlockStart.gifContractedBlock.gif
{
CTreeNode
*newnode,*newlptr,*newrptr;
if(t==NULL)
returnNULL;
if(t->Left()!=NULL)
newlptr
=CopyTree(t->Left());
else
newlptr
=NULL;
if(t->Right()!=NULL)
newrptr
=CopyTree(t->Right());
else
newrptr
=NULL;
newnode
=GetTreeNode(t->data,newlptr,newrptr);
returnnewnode;
}


voidLevelTravel(CTreeNode*t)
ExpandedBlockStart.gifContractedBlock.gif
{
queue
<CTreeNode*>q1;
CTreeNode
*p;
q1.push(t);
while(!q1.empty())
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
p
=q1.front();
q1.pop();
cout
<<p->data<<endl;
if(p->Left()!=NULL)
q1.push(p
->Left());
if(p->Right()!=NULL)
q1.push(p
->Right());

}

}

intmain()
ExpandedBlockStart.gifContractedBlock.gif
{
CTreeNode
*root=NULL;
root
=MakeSampleTree();
CTreeNode
*root1=CopyTree(root);
PostOrder(root);
intleafCount=0;
CountLeaf(root,leafCount);
cout
<<"叶子数:"<<leafCount<<"深度:"<<Depth(root)<<endl;
PrintTree(root,
0);
cout
<<"拷贝后:"<<endl;
PrintTree(root1,
0);
cout
<<"层序遍历:"<<endl;
LevelTravel(root);
ClearSampleTree(root);
system(
"pause");
return0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值