二叉树的建立与遍历(binary-tree)
题目描述
给出一棵二叉树,分别输出先序、中序、后序遍历结果。
输入
第1行:结点数n(1<=n<=100)
以下若干行,每行3个整数,分别表示父结点、左孩子、右孩子。若没有孩子,对应的整数为0.
输出
第1行:树根
第2行:先序遍历结果,数字间用1个空格分开。
第3行:中序遍历结果,数字间用1个空格分开。
第4行:后序遍历结果,数字间用1个空格分开。
样例输入
8
1 2 4
2 0 0
4 8 0
3 1 5
5 6 0
6 0 7
8 0 0
7 0 0
样例输出
3
3 1 2 4 8 5 6 7
2 1 8 4 3 6 7 5
2 8 4 1 7 6 5 3
这道题其实很像深搜,但是有三种输出,所以要写三个深搜,至于根节点,就是唯一一个没有父亲的啦~AC代码:
#include<cstdio>
struct Tree
{
int f;
int l,r;
}tree[105];
int n,g,c;
void fron(int x)
{
if(c==1)
{
printf(" ");
}
printf("%d",x);
c=1;
if(tree[x].l)
{
fron(tree[x].l);
}
if(tree[x].r)
{
fron(tree[x].r);
}
}
void midd(int x)
{
if(tree[x].l)
{
midd(tree[x].l);
}
if(c==1)
{
printf(" ");
}
printf("%d",x);
c=1;
if(tree[x].r)
{
midd(tree[x].r);
}
}
void back(int x)
{
if(tree[x].l)
{
back(tree[x].l);
}
if(tree[x].r)
{
back(tree[x].r);
}
if(c==1)
{
printf(" ");
}
printf("%d",x);
c=1;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
tree[a].l=b;
tree[a].r=c;
tree[b].f=tree[c].f=a;
}
for(int i=1;i<=n;i++)
{
if(tree[i].f==0)
{
g=i;
break;
}
}
printf("%d\n",g);
fron(g);
printf("\n");
c=0;
midd(g);
printf("\n");
c=0;
back(g);
printf("\n");
}