1086. Tree Traversals Again (25)

来源:互联网 发布:方维app.js 编辑:程序博客网 时间:2024/06/04 17:58

An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push(1); push(2); push(3); pop(); pop(); push(4); pop(); pop(); push(5); push(6); pop(); pop(). Then a unique binary tree (shown in Figure 1) can be generated from this sequence of operations. Your task is to give the postorder traversal sequence of this tree.


Figure 1

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive integer N (<=30) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 2N lines follow, each describes a stack operation in the format: "Push X" where X is the index of the node being pushed onto the stack; or "Pop" meaning to pop one node from the stack.

Output Specification:

For each test case, print the postorder traversal sequence of the corresponding tree in one line. A solution is guaranteed to exist. All the numbers must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input:
6Push 1Push 2Push 3PopPopPush 4PopPopPush 5Push 6PopPop
Sample Output:
3 4 2 6 5 1
分析:
(1)核心是有先序遍历和中序遍历构建树,然后后序遍历这棵树;
(2)第一个难点是从输入中提取出先序遍历和中序遍历;

#include<iostream>#include<string>#include<vector>#include<stack>using namespace std;struct node{int data;node *ls,*rs;};node *createtree(int n,int *p, int *q){if (n<=0) return NULL;node *root= new node;int k=0;while (p[0]!=q[k]) k++;root->data=p[0];root->ls=createtree(k,p+1,q);root->rs=createtree(n-k-1,p+1+k,q+1+k);return root;}int flag=0;void postorder (node *root){if (root->ls!=NULL) postorder (root->ls);if (root->rs!=NULL) postorder (root->rs);if (flag==0){cout<<root->data;flag=1;}else cout<<" "<<root->data;return;}int main (){vector<int> preo;vector<int> ino;stack<int> st;int n,i;cin>>n;while (preo.size()!=n||ino.size()!=n){string tmp;cin>>tmp;if (tmp=="Push"){int tmp2;cin>>tmp2;preo.push_back(tmp2);st.push(tmp2);}else {int tmp3=st.top();ino.push_back(tmp3);st.pop();}}int *preorder=new int [n];int *inorder=new int [n];for (i=0;i<n;i++){preorder[i]=preo[i];inorder[i]=ino[i];}node *root=new node;root=createtree (n,preorder,inorder);postorder (root);return 0;}


0 0
原创粉丝点击