9.二叉树的序遍历
2016-03-18 06:18
288 查看
二叉树的序遍历
时间限制: 1 s空间限制: 32000 KB
题目等级 : 白银 Silver
查看运行结果
题目描述 Description
求一棵二叉树的前序遍历,中序遍历和后序遍历
输入描述 Input Description
第一行一个整数n,表示这棵树的节点个数。
接下来n行每行2个整数L和R。第i行的两个整数Li和Ri代表编号为i的节点的左儿子编号和右儿子编号。
输出描述 Output Description
输出一共三行,分别为前序遍历,中序遍历和后序遍历。编号之间用空格隔开。
样例输入 Sample Input
5
2 3
4 5
0 0
0 0
0 0
样例输出 Sample Output
1 2 4 5 3
4 2 5 1 3
4 5 2 3 1
数据范围及提示 Data Size & Hint
n <= 16
代码:
#include
using namespace std;
#include
struct Tree{
int data,child[3];
};
Tree tree[17];
void xx(int i)
{
printf("%d ",tree[i].data);
for(int j=1;j<=2;++j)
if(tree[i].child[j]!=0)
xx(tree[i].child[j]);
}
void hx(int i)
{
for(int j=1;j<=2;++j)
if(tree[i].child[j]!=0)
hx(tree[i].child[j]);
printf("%d ",tree[i].data);
}
void zx(int i)
{
if(tree[i].child[1]!=0)//如果有左孩子,就一直找。
zx(tree[i].child[1]);
printf("%d ",tree[i].data);//如果没有左孩子,就输出当前点标号,
if(tree[i].child[2]!=0)
zx(tree[i].child[2]);//再去访问右孩子,访问右孩子时,也是先访问它的左孩子
return ;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
tree[i].data=i;
scanf("%d%d",&tree[i].child[1],&tree[i].child[2]);
}
xx(1);
printf("\n");
zx(1);
printf("\n");
hx(1);
printf("\n");
return 0;
}
相关文章推荐
- Swift开发第八篇——方法嵌套&命名空间
- 8.递归第一次
- Nginx(四):LNMMP架构实现Web动静分离
- 6.数的计算(递归算法)
- 1968: [Ahoi2005]COMMON 约数研究
- 5.十进制转m进制
- 4.m进制转十进制
- bzoj 1965: [Ahoi2005]SHUFFLE 洗牌
- 3.Cantor表
- 2.最大公约数和最小公倍数问题
- [Getting and Cleaning data] Project
- 1.明明的随机数(桶排序经典例题)
- 夺命雷公狗---DEDECMS----10dedecms双标签
- 最短路:我的理解--Dijkstra算法
- 很特别的一个动态规划入门教程
- 最短路径:我的理解--SPFA算法
- 双向广搜
- [git] Basic Git Command Line Reference for Windows Users
- bzoj 1951: [Sdoi2010]古代猪文
- 7. 最大公约数(辗转相除法)