文本二叉树

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;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值