文本二叉树

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值