5:文本二叉树
-
总时间限制:
- 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> #include<cmath> #include<cstring> #include<algorithm> #include<iomanip> #include<queue> #include<stack> #include<vector> #include<set> #include<map> using namespace std; string s; struct Node { char c; Node*l; Node*r; int level; int flag; Node(int len) { c=s[len-1];l=NULL;r=NULL;level=len-1;flag=0; } }; void Pre(Node*p) { if(p==NULL)return; cout<<p->c; Pre(p->l); Pre(p->r); } void Last(Node*p) { if(p==NULL)return; Last(p->l); Last(p->r); cout<<p->c; } void Mid(Node*p) { if(p==NULL)return; Mid(p->l); cout<<p->c; Mid(p->r); } Node*Build() { stack<Node*>Stack; cin>>s; int len=s.length(); Node*root=new Node(len); Stack.push(root); while(cin>>s) { int len=s.length(); Node*cur=new Node(len); if(s[0]=='0')break; Node*temp=Stack.top(); while(cur->level-temp->level!=1) { Stack.pop(); temp=Stack.top(); } if(cur->c=='*') { temp->flag++; continue; } if(temp->flag==0) { temp->l=cur; temp->flag++; } else if(temp->flag==1) { temp->r=cur; temp->flag++; } if(temp->flag==2) { Stack.pop(); } Stack.push(cur); } return root; } int main() { int Test; cin>>Test; while(Test--) { Node*root=Build(); Pre(root); cout<<endl; Last(root); cout<<endl; Mid(root); cout<<endl; cout<<endl; } return 0; }