文本二叉树
查看 提交 统计 提问
总时间限制: 1000ms 内存限制: 65536kB
描述
如上图,一棵每个节点都是一个字母,且字母互不相同的二叉树,可以用以下若干行文本表示:
A
-B
--*
--C
-D
--E
---*
---F
在这若干行文本中:
1) 每个字母代表一个节点。该字母在文本中是第几行,就称该节点的行号是几。根在第1行
2) 每个字母左边的'-'字符的个数代表该结点在树中的层次(树根位于第0层)
3) 若某第 i 层的非根节点在文本中位于第n行,则其父节点必然是第 i-1 层的节点中,行号小于n,且行号与n的差最小的那个
4) 若某文本中位于第n行的节点(层次是i) 有两个子节点,则第n+1行就是其左子节点,右子节点是n+1行以下第一个层次为i+1的节点
5) 若某第 i 层的节点在文本中位于第n行,且其没有左子节点而有右子节点,那么它的下一行就是 i+1个'-' 字符再加上一个 '*'
给出一棵树的文本表示法,要求输出该数的前序、后序、中序遍历结果
输入
第一行是树的数目 n
接下来是n棵树,每棵树以'0'结尾。'0'不是树的一部分
每棵树不超过100个节点
输出
对每棵树,分三行先后输出其前序、后序、中序遍历结果
两棵树之间以空行分隔
样例输入
2
A
-B
--*
--C
-D
--E
---*
---F
0
A
-B
-C
0
样例输出
ABCDEF
CBFEDA
BCAEFD
ABC
BCA
BAC
来源
Guo Wei
#include<iostream>
using namespace std;
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#define Floor 10
typedef char ElemType;
typedef struct Nodes
{
ElemType data;
int d; //用来记录左右,0左1右
int deepth; //记录层次
struct Nodes *lchild;
struct Nodes *rchild;
}BTreeNode;
int A(BTreeNode *t)
{
printf("%c",t ->data);
if(t ->lchild != NULL)
A(t ->lchild);
if(t ->rchild != NULL)
A(t ->rchild);
return 0;
}
int B(BTreeNode *t)
{
if(t ->lchild != NULL)
B(t ->lchild);
printf("%c",t ->data);
if(t ->rchild != NULL)
B(t ->rchild);
return 0;
}
int C(BTreeNode *t)
{
if(t ->lchild != NULL)
C(t ->lchild);
if(t ->rchild != NULL)
C(t ->rchild);
printf("%c",t ->data);
return 0;
}
bool TextCreateTree(BTreeNode *&h)
{
int top = -1;
char temp[Floor];
BTreeNode *stack[101];
BTreeNode *p1,*p2;
scanf("%s",temp);
h = p1 = (BTreeNode *)malloc(sizeof(BTreeNode));
p1 ->data = temp[strlen(temp)-1];
p1 ->d = 0;
p1 ->deepth = strlen(temp)-1;
p1 ->lchild = p1 ->rchild = NULL;
stack[++top] = p1;
while(~scanf("%s",temp))
{
if(temp[strlen(temp)-1] == '0')
{
break;
}
p2 = (BTreeNode *)malloc(sizeof(BTreeNode));
p2 ->data = temp[strlen(temp)-1];
p2 ->d = 0;
p2 ->deepth = strlen(temp)-1;
p2 ->lchild = p2 ->rchild = NULL;
p1 = stack[top];
while(p2 ->deepth - p1 ->deepth != 1 )
{
top--;
p1 = stack[top];
}
if(p2 ->data =='*')
{
p1 ->d++;
continue;
}
if(p1 ->d == 0)
{
p1 ->lchild = p2;
p1 ->d++;
}
else if(p1 ->d == 1)
{
p1 ->rchild = p2;
p1 ->d++;
}
if(p1 ->d == 2)
{
top--;
}
stack[++top] = p2;
}
return 0;
}
int main()
{
int n;
scanf("%d",&n);
getchar();
while(n--)
{
BTreeNode *h;
TextCreateTree(h);
A(h);
printf("\n");
C(h);
printf("\n");
B(h);
printf("\n\n");
}
return 0;
}