描述
给定一颗二叉树,要求输出二叉树的深度以及先序遍历二叉树得到的序列。本题假设二叉树的结点数不超过1000。
输入
输入数据分为多组,第一行是测试数据的组数n,下面的n行分别代表一棵二叉树。每棵二叉树的结点均为正整数,数据为0代表当前结点为空,数据为-1代表二叉树数据输入结束,-1不作处理。二叉树的构造按照层次顺序(即第1层1个整数,第2层2个,第3层4个,第4层有8个......,如果某个结点不存在以0代替),比如输入:
1 2 0 3 4 -1得到的二叉树如下:
输出
输出每棵二叉树的深度以及先序遍历二叉树得到的序列。
样例输入
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