《数据结构》03-树3 Tree Traversals Again

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.

Figure1Figure 1Figure1
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 操作要做的事有两种可能:

  1. 入栈当前结点的左儿子结点
  2. 入栈当前结点的右儿子结点

好像说了废话,想想非递归遍历的操作,如果左儿子结点一直都有,那么入栈的一直是左儿子结点,只有当左儿子结点已经没有了,才"勉为其难"入栈右儿子结点。
而对于 pop 操作要做的事也有两种可能:

  1. 当前结点的左儿子结点为空时出栈
  2. 当前结点的右儿子结点为空时出栈

抱歉又说了废话…其实也不是,每次 push 后第一个 pop 时肯定代表着当前结点的左儿子为空,其后的 pop 代表着当前右儿子为空(想一想为什么?)
大概轮廓有了,剩下的就是细节了,最麻烦的一个就是,如何找到"当前结点"
当 pop 时,出栈的栈顶结点肯定是"当前结点"了,
而当 push 时,入栈的结点肯定是"当前结点"啦

还原出了树用递归实现后序遍历,(毕竟非递归有点麻烦)

#include
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值