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 }

 

posted @ 2020-03-02 09:23  tangq123  阅读(337)  评论(0编辑  收藏  举报