boj 1307 二叉树前序遍历

地址:http://acm.scs.bupt.cn/onlinejudge/showproblem.php?problem_id=1307

第三题:二叉树前序遍历 Submit: 3319    Accepted:939 Time Limit: 1000MS  Memory Limit: 65535K

Description
给定一棵有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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值