您的位置:首页 > 大数据 > 人工智能

03-树3 Tree Traversals Again (25分)

2020-07-26 22:27 295 查看

03-树3 Tree Traversals Again (25分)



思路分析:给出的样例就是说如果按照堆栈操作那么,出来的就是这个二叉树的中序遍历的结果,然后push操作的值就是二叉树前序遍历的结果,所以题目的意思就是,已知一个二叉树的中序遍历和前序遍历求得这个二叉树的后序遍历


每次在前序遍历中寻找根节点,然后从中序遍历中获取左子树和右子树的个数,然后再构造后序遍历数组,后序遍历数组的最后一位是根节点,然后每一次划分子树以后,那么该序列的最后一位也是 该子树的根, 采用递归逐渐将前序和中序遍历的结果划小,注意每一个划小数列的小标

值得注意的是:
C语言没有string类型,所以比较字符串的时候要用到 strcmp()的函数,但是C++有string类,而且string类重载了关系运算符,可以直接进行比较
记得包含堆栈的头文件:

(1). push(x) 将x入栈
(2). top() 获得栈顶元素
(3). pop() 用以弹出栈顶元素
(4). empty() 可以检测stack内是否为空,返回true为空,返回false为非空
(5). size() 返回stack内元素的个数

#include<iostream>
#include<stack>
#include<string>
#define Maxsize 30
using namespace std;
int preorder[Maxsize], inorder[Maxsize], postorder[Maxsize];

void createPostorder (int preN, int inN, int postN, int N)
{
int L,R;
if(N == 0) return;
if(N == 1)
{
postorder[postN] = preorder[preN];
return;
}
int i =0;
int root = preorder[preN];
postorder[postN +N-1] = root; //这里很关键,如果知识N-1,那么在中间的右子树的序列将会发生错误
for( i = 0; i<N; i++)//找到根在中序中的位置
{
if(inorder[inN+i]==root) break;
}
L = i;//左子树结点点数
R = N-(i+1);//右子树结点数
createPostorder(preN+1,inN,postN,L);//建立左子树
createPostorder(preN+L+1,inN+L+1,postN+L,R);//建立右子树
}
int main()
{
stack<int> s;
int num;
cin  >> num;
string ch;
int i = 0, j = 0,z = 0;
for( i=0; i<2*num;i++)
{
cin >>ch;
if(ch == "Push")
{
int num1;
cin >> num1;
preorder[j++] = num1;
s.push(num1);
}else if(ch == "Pop")
{
inorder[z++] = s.top();
s.pop();
}
}
createPostorder(0,0,0,num);
for(i = 0;i<num;i++)
{
cout << postorder[i];
if(i!=num-1) cout<<" ";
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: