现在在学数据结构,这题参考了1206401027和1206401001的代码。
描述
给定一颗二叉树,要求输出二叉树的深度以及先序遍历二叉树得到的序列。本题假设二叉树的结点数不超过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
1 2 0 3 4 -1
样例输出
1 1
3 1 2 3 4
3 1 2 3 4
#include <iostream>
using namespace std;
int q[2013], i; //q数组保存输入数据,i保存个数
typedef int Elemtype;
typedef struct BitreeNode
{
Elemtype data;
struct BitreeNode *lchild, *rchild;
}BitreeNode, *Bitree;
int GreatBitree(Bitree &t,int p)//创建二叉树
{
if(p>i || q[p]==0)
{ t=NULL; return 0; }
else
{
t = new BitreeNode;
t->data = q[p];
GreatBitree(t->lchild,2*p);//左孩子的位置总是2*自己的位置
GreatBitree(t->rchild,2*p+1);//右孩子的位置总是2*自己的位置+1
return 1;
}
}
int Height(Bitree t)//求出深度
{
int hl, hr;
if(t==NULL) return 0;
else
{
hl = Height(t->lchild)+1;
hr = Height(t->rchild)+1;
return hl>hr?hl:hr;
}
}
void Firstorder(Bitree t)//先序遍历输出
{
if(t)
{//如果要改成中序或者后序的话就改变下面这三行的顺序就可以了
cout<<' '<<t->data;
Firstorder(t->lchild);
Firstorder(t->rchild);
}
}
int main()
{
int nl;
Bitree t;
t=NULL;
cin>>nl;
while(nl--)
{
int n;
i=1;
while(cin>>n)//输入数据
{
if(n==-1)//以-1结束
break;
else
q[i++]=n;
}
i--;//前面i多加了1,现在减掉
GreatBitree(t,1);
cout<<Height(t);
Firstorder(t);
cout<<endl;
}
return 0;
}