/*
3:文本二叉树
查看 提交 统计 提问
总时间限制: 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
*/
include<iostream>
#include<algorithm>
#include<string>
#include<stack>
using namespace std;
struct Node
{
char c;
Node *leftChild, *rightChild;
int len;
int d; //记录左右节点,0为左节点,1为右节点
};
Node* BuildTree()
{
string s;
int len,top = 1;
stack<Node*> Stack;
cin >> s;
Node *root = new Node;
root->c = s[0];
root->leftChild = NULL;
root->rightChild = NULL;
root->len = 0;
root->d = 0;
Stack.push(root);
while (cin >> s)
{
if (s == "0")
break;
len = s.length();
Node *new_Node = new Node;
new_Node->c = s[len - 1];
new_Node->leftChild = NULL;
new_Node->rightChild = NULL;
new_Node->len = len-1;
new_Node->d = 0;
Node *r = Stack.top();
while (new_Node->len - r->len != 1)
{
Stack.pop();
r = Stack.top();
}
if (new_Node->c == '*')
{
r->d++;
continue;
}
if (r->d == 0)
{
r->leftChild = new_Node;
r->d++;
}
else if (r->d == 1)
{
r->rightChild = new_Node;
r->d++;
}
if (r->d == 2)
Stack.pop();
Stack.push(new_Node);
}
return root;
}
void PreOrder(Node *root)
{
if (root)
{
cout << root->c;
PreOrder(root->leftChild);
PreOrder(root->rightChild);
}
}
void InOrder(Node *root)
{
if (root)
{
InOrder(root->leftChild);
cout << root->c;
InOrder(root->rightChild);
}
}
void PostOrder(Node *root)
{
if (root)
{
PostOrder(root->leftChild);
PostOrder(root->rightChild);
cout << root->c;
}
}
int main()
{
int t;
cin >> t;
for (int i = 0; i < t; ++i)
{
Node *root = BuildTree();
PreOrder(root);
cout << endl;
PostOrder(root);
cout << endl;
InOrder(root);
cout << endl;
cout << endl;
}
return 0;
}
文本二叉树
最新推荐文章于 2018-04-10 21:53:59 发布