数据结构二叉树的操作遍历及树形输出文档格式.docx
《数据结构二叉树的操作遍历及树形输出文档格式.docx》由会员分享,可在线阅读,更多相关《数据结构二叉树的操作遍历及树形输出文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
//先序输入二叉树结点的值,空格表示空树
voidcreateBiTree(BiTree&
T)
{
charch;
//输入结点时用
scanf("
%c"
&
ch);
if(ch=='
'
)//若输入空格,该值为空,且没有左右孩子
{
T=NULL;
}else{
T=(BiTNode*)malloc(sizeof(BiTNode));
//分配结点空间
if(!
T)//分配失败
{
exit(OVERFLOW);
}
T->
data=ch;
//生成根结点
createBiTree(T->
lchild);
//构造左子树
rchild);
//构造右子树
}
}
//递归方法先序遍历二叉树
voidpreOrderTraverse(BiTreeT)
if(T)//若非空
if(T->
data)
{//输出
printf("
T->
data);
preOrderTraverse(T->
//递归方法中序遍历二叉树
voidinOrderTraverse(BiTreeT)
//递归方法后序遍历二叉树
voidpostOrderTraverse(BiTreeT)
//层序遍历二叉树
voidLevelTraverse(BiTreeT)
{
queue<
BiTree>
q;
//建队
q.push(T);
//根节点入队
BiTreep;
while(!
q.empty())
p=q.front();
//获得队列的首元素
q.pop();
//首元素出队
cout<
<
p->
data<
"
"
;
//输出结点的值
if(p->
lchild!
=NULL)//若结点的左孩子不空
q.push(p->
rchild!
=NULL)//若结点的右孩子不空
//非递归方法前序遍历二叉树
voidstackPreOrderTraverse(BiTreeT)
stack<
s;
//建栈
s.push(T);
//根结点入栈
//栈首元素
s.empty())
while((p=s.top())&
&
p)
p->
s.push(p->
//左孩子入栈,直到走到尽头
s.pop();
//空指针出栈
p=s.top();
//获得栈顶元素
s.pop();
//出栈
//右孩子入栈
//非递归方法中序遍历二叉树
voidstackInOrderTraverse(BiTreeT)
//入栈
//非递归方法后序遍历二叉树
voidstackPostOrderTraverse(BiTreeT)
//建栈
map<
BiTree,bool>
m;
//标记结点是否已经输出
//栈首元素
if(T)//若不是空树
s.push(T);
//根结点入栈
{
while(true)
{//目的:
找到后序遍历要输出的结点
while((p=s.top())&
lchild&
!
m[p->
lchild])
{//若左孩子未输出,将左孩子入栈,直到尽头,不包括空指针
s.push(p->
}
if((p=s.top())&
rchild&
rchild])
{//若最左孩子的右孩子未输出且非空,则入栈
}else{
break;
//找到结点跳出循环
if((p=s.top())&
m[p])
m[p]=true;
//标记已经输出
//退栈
//后序遍历求二叉树的高度递归算法
intPostTreeDepth(BiTreeT)
inthl,hr,max;
if(T!
=NULL)
hl=PostTreeDepth(T->
//求左子树的深度
hr=PostTreeDepth(T->
//求右子树的深度
max=hl>
hr?
hl:
hr;
//得到左、右子树深度较大者
return(max+1);
//返回树的深度
else
return(0);
//如果是空树,则返回0
/*按竖向树状打印的二叉树代码是为了实现二叉树的横向显示问题。
这种树形要求先打印右子树,再打印根,最后打印左子树,顺序恰为逆中序顺序。
这种输出格式,结点的左右位置与结点的层深有关,
故算法中设置了一个表示当前根节点层深的参数,以控制输出结点的左右位置。
*/
voidPrintTree(BiTreeT,intnLayer)
inti;
if(T==NULL)return;
PrintTree(T->
rchild,nLayer+1);
for(i=0;
i<
nLayer;
i++)
printf("
);
%c\n"
lchild,nLayer+1);
//叶子结点的个数以及元素
intTreeLeaf(BiTreeT)
if(T)
if(!
T->
rchild)
LeafNum++;
cout<
TreeLeaf(T->
returnLeafNum;
intmain()
BiTreeT;
//定义结点
intlayer=0;
//层数
while(true)
输入二叉树结点值空格表示空树:
endl;
createBiTree(T);
递归先序遍历:
preOrderTraverse(T);
递归中序遍历:
inOrderTraverse(T);
递归后序遍历:
postOrderTraverse(T);
层序遍历:
LevelTraverse(T);
非递归先序遍历:
stackPreOrderTraverse(T);
非递归中序遍历:
stackInOrderTraverse(T);
非递归后序遍历:
stackPostOrderTraverse(T);
叶子结点为:
叶子结点个数为:
TreeLeaf(T)<
树的的深度:
layer=PostTreeDepth(T);
layer<
二叉树的树形结构图:
PrintTree(T,layer);
return0;