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:
1 | 6 |
Sample Output:
1 | 3 4 2 6 5 1 |
分析:
从堆栈实现二叉树非递归遍历算法可知,入栈操作是先序遍历的顺序,而出栈操作则是中序遍历操作的顺序,需要输出后序遍历的顺序;所以需要根据push和pop构造出先序数组和中序数组,再利用递归算法依次找到根结点左右两边各元素的顺序。
编码:
1 |
|
小结:
- 在构造先序数组和中序数组时,用strchr(temp, ‘h’)函数判断字符串中是否包含字符h,包含返回具体的地址,不包含返回NULL;
- 先序数组的第1个元素为后序数组的最后一个元素,即为根结点,如何根据这个条件写递归函数;
- 构造的递归函数的边界条件,如len=0,len=1,如何确定?