2018.4.18
这道题说的是利用栈来模拟二叉树,通过栈的出入情况,模拟出这棵二叉树,并后序遍历打印这棵二叉树。
这题关键点在于理解二叉树的非递归遍历,能够看得出入栈顺序就是二叉树的先序遍历序列,出栈顺序就是二叉树的中序遍历序列。理解了这点这道题就转换成已知先序遍历+中序遍历,打印二叉树的后序遍历的问题了。
有两个思路:1.根据先序遍历和中序遍历先构建一棵二叉树,再后序遍历打印这棵树;2.直接通过先序遍历和中序遍历得出后序遍历序列。其实能够做出思路1,想想肯定能做出思路2。本题我采用的是思路2。
思路概述:先序遍历的第一个结点,在中序遍历中的位置i,i对应根节点,中序遍历中i左半部分的元素即为根节点左子树,右半部分元素即为根节点右子树。通过先序遍历先递归左子树的根节点,再递归右子树的根节点,直到递归到叶节点时打印,在递归函数出栈时依次打印根节点,就可以输出该二叉树的后序遍历。
这题其实很简单,但是我碰上了两个大坑,1.在验证输入字符串时,不能用==,要用equals;2.注意N大于10时字符串为2位数,不能用int data = str[1].charAt(0) - '0';,要用int data = Integer.parseInt(str[1]);,否则N>10输出结果不正确。为了查出第二个大坑花了两个晚上,之前因为十位以内的输入都正确了,输入push等又太麻烦,因此调试的时候都直接跳过了输入步骤直接给前序遍历和中序遍历赋值查输出结果。查到错之后感慨万分,debug这种事还是得踏踏实实地来啊。(代码中和文后附一个自己手撕的N=30的测试样例)
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);