1086 Tree Traversals Again

Posted keep23456

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1086 Tree Traversals Again相关的知识,希望对你有一定的参考价值。

 这是一道二叉树遍历模板题。

大致题意就是给出 用栈模拟二叉树的中序遍历过程,推断出push的全部元素是先序序列,pop的全部元素是中序序列,最后 根据 先序+中序 = 二叉树,输出二叉树的后序序列。

注意点:如果使用 getline(cin,str),必须要考虑 元素值大于 10的情况,不然 最后一个测试点过不去。

 1 #include<iostream>
 2 #include<stack>
 3 using namespace std;
 4 const int maxn = 200;
 5 struct Node {
 6     int data;
 7     Node* lchild;
 8     Node* rchild;
 9 };
10 
11 int n;//结点个数
12 int pre[maxn] ,in[maxn];//先序序列、后序序列
13 
14 Node* create(int preL,int preR,int inL,int inR) {
15     //第一步,确定递归边界
16     if(inL > inR) return NULL;
17     //第二步,保存根节点
18     Node* root = new Node;
19     root->data = pre[preL];
20     //第三步,用根节点划分中序序列,求出左子树结点的个数
21     int k,leftNum = 0;
22     for(k = inL; k <= inR; ++k)
23         if(in[k] == pre[preL]) break;
24     leftNum = k-inL;
25     //第四步,确定左子树的先序序列和中序序列,确定右子树的先序序列和中序序列
26     root->lchild = create(preL+1,preL+leftNum,inL,k-1);
27     root->rchild = create(preL+leftNum+1,preR,k+1,inR);
28     return root; //又忘记了这个小可爱~~
29 }
30 
31 int num = 0;
32 void postorder(Node* root) { //后序遍历 
33     if(root == NULL) return ;
34     postorder(root->lchild);
35     postorder(root->rchild);
36     if(num > 0) printf(" ");
37     printf("%d",root->data);
38     num++;
39 }
40 
41 int main() {
42     cin>>n;
43     string str;
44     int preIndex = 0,inIndex = 0,x;
45     stack<int> st;
46     for(int i = 0; i < 2*n; ++i) { //出栈入栈 2n次
47         cin>>str;
48         if(str == "Pop") {
49             in[preIndex++] = st.top();//中序序列 
50             st.pop();
51         } else {
52             cin>>x;
53             pre[inIndex++] = x;//先序序列 
54             st.push(x);
55         }
56     }
57     Node* root = create(0,n-1,0,n-1);
58     postorder(root);
59     return 0;
60 }

技术图片

 

以上是关于1086 Tree Traversals Again的主要内容,如果未能解决你的问题,请参考以下文章

PAT_A1086#Tree Traversals Again

PAT 1086. Tree Traversals Again

PAT 甲级 1086 Tree Traversals Again

PAT 1086 Tree Traversals Again (25)

1086 Tree Traversals Again (25分)(树的重构与遍历)

PAT Advanced 1086 Tree Traversals Again (25分)