您的位置:首页 > 其它

由中根序列和后根序列重建二叉树

2015-12-08 17:57 183 查看
/*
1:由中根序列和后根序列重建二叉树
查看 提交 统计 提问
总时间限制: 500ms 内存限制: 65535kB
描述
我们知道如何按照三种深度优先次序来周游一棵二叉树,来得到中根序列、前根序列和后根序列。
反过来,如果给定二叉树的中根序列和后根序列,或者给定中根序列和前根序列,可以重建一二叉树。
本题输入一棵二叉树的中根序列和后根序列,要求在内存中重建二叉树,最后输出这棵二叉树的前根序列。

用不同的整数来唯一标识二叉树的每一个结点,下面的二叉树

中根序列是9 5 32 67

后根序列9 32 67 5

前根序列5 9 67 32

输入
两行。第一行是二叉树的中根序列,第二行是后根序列。每个数字表示的结点之间用空格隔开。
结点数字范围0~65535。暂不必考虑不合理的输入数据。
输出
一行。由输入中的中根序列和后根序列重建的二叉树的前根序列。每个数字表示的结点之间用空格隔开。
样例输入
9 5 32 67
9 32 67 5
样例输出
5 9 67 32
*/
#include<iostream>
using namespace std;
#define MaxNum 65536
int InOrder[MaxNum], PostOrder[MaxNum];
struct Node
{
int data;
Node *leftChild, *rightChild;
};
Node* BuildTree(int In_Start, int In_End, int Post_Start, int Post_End)
{
Node *root = new Node;
root->data = PostOrder[Post_End];
root->leftChild = NULL;
root->rightChild = NULL;
int n = 0;
while (InOrder[In_Start + n] != root->data)
n++;
if (n >= 1)
root->leftChild = BuildTree(In_Start, In_Start + n - 1, Post_Start, Post_Start + n - 1);
if (In_Start + n < In_End)
root->rightChild = BuildTree(In_Start + n + 1, In_End, Post_Start + n, Post_End - 1);
return root;
}
void Pre_Travel(Node *root)
{
if(root)
{
cout << root->data << ' ';
Pre_Travel(root->leftChild);
Pre_Travel(root->rightChild);
}
}
void delete_Tree(Node *root)
{
while (root)
{
delete_Tree(root->leftChild);
delete_Tree(root->rightChild);
delete[] root;
root = NULL;
}
}
int main()
{
int i = 0,num = 0;
while (cin >> InOrder[i++])
{
if (cin.get() != ' ')   //遇到回车则停止输入
break;
}
i = 0;
while (cin >> PostOrder[i++])
{
if (cin.get() != ' ')   //遇到回车则停止输入
break;
}
num = i - 1;
Node *root = BuildTree(0, num, 0, num);
Pre_Travel(root);
delete_Tree(root);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: