地址:http://acm.scs.bupt.cn/onlinejudge/showproblem.php?problem_id=1307
第三题:二叉树前序遍历 Submit: 3319 Accepted:939 Time Limit: 1000MS Memory Limit: 65535KDescription
给定一棵有n个结点的二叉树,结点的编号为0~n-1。请你编写程序输出二叉树的前序遍历序列。
Input
输入的第一行是一个正整数t(1 < t < 20),表示有t组测试用例。
对于每组测试用例,第一行是一个整数n(0 < n < 20),表示二叉树结点个数。第二行是一个数r(0≤r≤n-1),二叉树根结点的编号。
后面有n-1行,表示二叉树n-1条边的信息。每行三个数a,b,c,三个数间由空格隔开,其中0≤a,b≤n-1且a≠b, c为0或1。a表示边的起点,b表示边的终点。如果c为0,表示b是a的左儿子;如果c为1,表示b是a的右儿子。
Output
对于每组测试用例输出一行,即:该二叉树的前序遍历序列,两个节点编号之间留一个空格。
Sample Input
2
3
2
2 0 0
2 1 1
7
0
0 1 0
0 2 1
1 3 0
1 4 1
2 5 0
2 6 1
Sample Output
2 0 1
0 1 3 4 2 5 6
Hint
由于是计算机自动判题,请严格按照题目的描述输入输出,不要有任何多余的字符出现,尤其是输出行的行首和行尾都不要有多余的空格
Source
#include<iostream>
using namespace std;
typedef struct
{
int left,right;
}bigtree;
int sum;
void pre(bigtree tree[],int i,int n) //sum用来判断是否为最后一个
{
if(tree[i].left!=-1)
{
sum++;
if(sum<n)
printf("%d ",tree[i].left);
if(sum==n)
printf("%d/n",tree[i].left);
pre(tree,tree[i].left,n);
/// pre(tree,tree[i].right,n);
}
if(tree[i].right!=-1)
{
sum++;
if(sum<n)
printf("%d ",tree[i].right);
if(sum==n)
printf("%d/n",tree[i].right);
// pre(tree,tree[i].left,n);
pre(tree,tree[i].right,n);
}
}
int main()
{
bigtree tree[100];
int i,j,t,n,r,a,b,c,count;
scanf("%d",&t);
while(t--)
{
sum=1;
scanf("%d",&n);
for(i=0;i<=n;i++) //初始化
tree[i].left=tree[i].right=-1;
scanf("%d",&r);
//tree[1]=r;
for(i=1;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(c==0)
tree[a].left=b;
else
tree[a].right=b;
} //for
printf("%d ",r);
pre(tree,r,n);
}
system("pause");
return 0;
}