1086 Tree Traversals Again

mac2024-07-04  60

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.

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: 6 Push 1 Push 2 Push 3 Pop Pop Push 4 Pop Pop Push 5 Push 6 Pop Pop Sample Output: 3 4 2 6 5 1

non-recursive 非递归 (好像并不影响题意,不知道干啥,但是就怕考试的时候紧张,怕想太多o((>ω< ))o)

=================================================================== 模板题,难点在于发现入栈的顺序其实就是树的先序遍历,之后就很简单了,做树的题目时很多都要求遍历输出,最后一个不要空格,关键就在于遍历的时候判断是不是最后一个节点,这很简单,在代码里面有体现,树的先,中,后遍历一开始比较晦涩难懂,做多了,多思考就不是那么难了,另一方面模板的熟练度也要加强。

#include<iostream> #include<cstdio> #include<algorithm> #include<queue> #include<stack> const int maxn = 35; using namespace std; struct node{ int date; node* lchild; node* rchild; }; int post[maxn],in[maxn],pre[maxn],n; int num=0; node* create(int prel,int prer,int inl,int inr){ if(prel > prer) return NULL; node* root =new node; root->date = pre[prel]; int k; for(k=inl;k<=inr;k++){ if(in[k] == pre[prel]) break; } int num = k - inl; root->lchild = create(prel+1,prel+num,inl,k-1); root->rchild = create(prel+1+num,prer,k+1,inr); return root; } void postorder(node* root){ if(root == NULL) return; postorder(root->lchild); postorder(root->rchild); cout<<root->date; num++; if(num < n) cout<<' '; } int main(){ cin>>n; stack<int> stk; int j=0,k=0; for(int i=1;i<=2*n;i++){ string s; cin>>s; if(s == "Push"){ int x; cin>>x; pre[j++] = x; stk.push(x); } else{ int top = stk.top(); stk.pop(); in[k++] = top; } } node* root = create(0,n-1,0,n-1); postorder(root); return 0; }
最新回复(0)