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

03-树3 Tree Traversals Again

2016-05-16 23:23 381 查看
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 (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

思路:其实就是根据先序遍历和中序遍历构造出后序遍历。用递归处理时最好在纸上写清楚

#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
const int maxn=32;
int pre_order[maxn],in_order[maxn],post_order[maxn],N;
void solve(int left1,int right1,int left2,int right2,int left3,int right3){
if(left1>right1)
return;//终止条件
int L,root=pre_order[left1];
post_order[right3]=root;
for(int i=left2;i<=right2;i++){
if(in_order[i]==root){
L=i;
break;
}
}
solve(left1+1,left1+L-left2,left2,L-1,left3,left3+L-left2-1);
solve(left1+L-left2+1,right1,L+1,right2,left3+L-left2,right3-1);
}
int main(){
//freopen("in.txt","r",stdin);
int n,index1=0,index2=0,val;
char str[10];
stack<int>s;
scanf("%d",&N);
n=2*N;
while(n--){
scanf("%s",str);
if(str[1]=='u'){
scanf("%d",&val);
pre_order[index1++]=val;
s.push(val);
}//push为先序遍历
else if(str[1]=='o'){
in_order[index2++]=s.top();//pop为后序遍历
s.pop();
}
}
solve(0,N-1,0,N-1,0,N-1);
printf("%d",post_order[0]);
for(int i=1;i<N;i++)
printf(" %d",post_order[i]);
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  遍历