题目描述
任意二叉树可以根据完全二叉树性质保存在一个数组中。已知二叉树的数组存储,用程序构建该二叉树。
输入
第一行输入一个整数t,表示有t个测试数据
第二行起输入二叉树的数组存储结果,空树用字符‘0’表示,输入t行
数组的数据由大写字母和0表示
输出
逐行输出每个二叉树的先序结果
样例输入
3
ABC0D
ABCDEF000G
ABEC0F0D0
样例输出
ABDC
ABDEGCF
ABCDEF
样例输出
ABDC
ABDEGCF
ABCDEF
代码如下:
#include<iostream>
#include<string>
using namespace std;
class BiTreeNode
{
public:
char data;
BiTreeNode *Left;
BiTreeNode *Right;
BiTreeNode()
{
Left=NULL;
Right=NULL;
}
~BiTreeNode()
{
delete Left;
delete Right;
}
};
class BiTree
{
public:
BiTreeNode *Root;
string strTree; //存放构建树的数组
void CreateTree(string TreeArray){
strTree.assign(TreeArray);
Root = CreateBiTree(0); //从数组的0号位置开始建树
}
BiTreeNode* CreateBiTree(int pos)//pos为游标
{
BiTreeNode *T;
//如果游标超过数组长度,该节点直接指向空
if(pos >= strTree.length()) return NULL;
//ch为数组下标为pos时的元素
char ch=strTree[pos];
//若数组元素为0,该节点指向空
if(ch=='0')
{
T = NULL;
} else {
//根据二叉树的性质5建树
//父节点为i时,左右孩子的位置分别为2i+1,2i+2
T=new BiTreeNode(); //为该节点分配空间
T->data=ch;
T->Left=CreateBiTree(pos*2+1);
T->Right=CreateBiTree(pos*2+2);
}
pos++;//游标向前移动
return T;
}
//先序输出该树
void Pre(BiTreeNode *p)
{
if(p)
{
cout<<p->data;
Pre(p->Left);
Pre(p->Right);
}
}
};
int main()
{
int T;
cin>>T;
while(T--)
{
string str;
cin>>str;
BiTree tree;
tree.CreateTree(str);
tree.Pre(tree.Root);
cout<<endl;
}
return 0;
}