先写下题目吧。
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.
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.
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.
6
Push 1
Push 2
Push 3
Pop
Pop
Push 4
Pop
Pop
Push 5
Push 6
Pop
Pop
3 4 2 6 5 1
这道题在之前陈越老师还没出讲解的时候做了一遍,大致思路是根据出给的前序和中序得到两个数列,再根据遍历算法生成二叉树。这里我只贴出根据前序和中序数列建二叉树的过程。
BinTree BuildTree(int preorder[],int pre_s,int pre_e,int inorder[],int in_s,int in_e) //preorder和inorder分别为前序和中序的数列,pre_s,in_s分别是数列起点
//pre_e和in_e分别为数列最后元素所在位置
{
int i;
BinTree p;
if(in_s>in_e)
return NULL;
for(i=in_s;iData=preorder[pre_s];
p->Left=BuildTree(preorder,pre_s+1,pre_s+i-in_s,inorder,in_s,i-1);
p->Right=BuildTree(preorder,pre_s+i-in_s+1,pre_e,inorder,i+1,in_e);
return p;
}
主要的思想是分而治之。
今天听了这道题讲解,多了一个新思路,不建树,根据前序遍历的第一个元素即是后序遍历的最后一个元素,分而治之,下面给出我写的不用建树,直接得出后序遍历数列的程序。
void posttraversal2(int preorder[],int pre_s,int pre_e,int inorder[],int in_s,int in_e)
{
int i;
if(in_s>in_e)
return ;
postorder[count_3]=preorder[pre_s];
count_3--;//初始值为前序遍历的最后一个元素的下标
for(i=in_s;i
其实这部分程序我直接根据上面建树的部分改写的,主要一点是得先遍历右子树,再遍历左子树。我测了一下,答案应该是一样的