(TOJ1222)数据结构练习题——先序遍历二叉树

描述

给定一颗二叉树,要求输出二叉树的深度以及先序遍历二叉树得到的序列。本题假设二叉树的结点数不超过1000。

输入

输入数据分为多组,第一行是测试数据的组数n,下面的n行分别代表一棵二叉树。每棵二叉树的结点均为正整数,数据为0代表当前结点为空,数据为-1代表二叉树数据输入结束,-1不作处理。二叉树的构造按照层次顺序(即第1层1个整数,第2层2个,第3层4个,第4层有8个......,如果某个结点不存在以0代替),比如输入:

1 2 0 3 4 -1得到的二叉树如下:

(TOJ1222)数据结构练习题——先序遍历二叉树

输出

输出每棵二叉树的深度以及先序遍历二叉树得到的序列。

样例输入

2

1 -1

1 2 0 3 4 -1

样例输出

1 1

3 1 2 3 4
 1 #include <stdio.h>

 2 #include <string.h>

 3 #include <ctype.h>

 4 #include <math.h>

 5 

 6 int BiTree[10000];

 7 

 8 void PreTraverse(int T[], int e)  //递归先序遍历二叉树T中序号为e的子树 

 9 {

10     printf(" %d",T[e]);    //访问树T中序号为e的节点 

11   if(T[2*e+1]!=0) PreTraverse(T,2*e+1);  //序号为e的节点的左子树不空 

12   if(T[2*e+2]!=0) PreTraverse(T,2*e+2);  //序号为e的节点的右子树不空 

13 }

14 

15 void PreOrderTraverse(int T[])

16 {

17     PreTraverse(T,0);   //递归先序遍历树T中序号为0的树 

18     printf("\n");

19 }

20 

21 int TreeDeep(int T[], int n)

22 {

23     int i;

24     for(i=n-1; i>=0; i--)

25     {

26         if(T[i]!=0)  break;

27     }

28     return (int)(log(i+1)/log(2)+1.1);

29 }

30 

31 int main()

32 {

33     int n,t,i;

34     scanf("%d",&n);

35     while(n--)

36     {

37         i=0;

38         while(scanf("%d",&t) && t!=-1)

39         {

40               BiTree[i++]=t;

41         }

42         printf("%d",TreeDeep(BiTree,i));

43         PreOrderTraverse(BiTree);

44     }

45     return 0;

46 }

47     
 

你可能感兴趣的:(数据结构)