03-树3 Tree Traversals Again (25 分)

题目

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:
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

分析

仔细观察push与pop指令,总结出如下规律:
1.Push:当前结点左孩子为空则插入为左孩子,否则,右孩子为空则插入为右孩子。左孩子优先插入。
将插入结点作为当前结点。
2.Pop:出栈元素为当前结点。

以样例为例:
push 1 2 3:只有左孩子的斜二叉树;
pop pop:当前结点指向最后一个出栈的元素 2;
push 4:为2结点插入右孩子4;
pop pop:当前结点指向最后一个出栈的元素 1;
push 5 6:为1结点插入右孩子5,为5结点插入左孩子6;
pop pop:栈为空,总插入节点数等于n=6,结束操作。

代码

#include<iostream>
#include<cstring>
#include<stack>
#define MAX 10000000
using namespace std;
struct BTNode{
 int left,right;
 int pos;
}T[MAX];
int flag=0;
int CreatTree(BTNode T[],int n){
 for(int i=1;i<=n;i++){
  T[i].left=-1;T[i].right=-1;T[i].pos=i;
 }
 stack<int>s;
 int R;
 char order[10];
 int r,b,step=0;
 cin>>order>>r;
 s.push(r);R=r;
 step++;
 while(step<n||!s.empty()){
  b=r;
  cin>>order;
  if(order[1]=='u'){
   cin>>r;
         s.push(r);step++;
         if(T[b].left==-1) T[b].left=r;
         else if(T[b].right==-1)T[b].right=r;
  }
  if(order[1]=='o'){
   r=s.top();
   s.pop();
  }
 }
 return R;
}
void PostOrder(BTNode T[],int R){
 if(T[R].left>=0)
 PostOrder(T,T[R].left);
 if(T[R].right>=0)
 PostOrder(T,T[R].right);
 if(flag==0)flag=1;
 else cout<<" ";
 cout<<T[R].pos;
}
int main(){
 int n;
 cin>>n;
 int R=CreatTree(T,n);
 PostOrder(T,R);
 return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值