求给定的二叉树的后序遍历。
binary-tree-postorder-traversal
http://www.nowcoder.com/questionTerminal/32af374b322342b68460e6fd2641dd1b
如果是前序遍历,我们的顺序是根节点,左节点,右节点。如果我们用一个栈来实现,可以这样考虑:先把根节点压入栈,在栈中有元素的时候循环:每次弹出栈顶元素,然后先压入栈顶元素的右边节点,再压入栈顶元素的左边节点。
因为栈是先进后出,因此要先压入右边的节点,因此第二次执行while循环的时候,栈顶元素就是左节点A,然后再来压入右节点A->R压入左节点A->L,注意,下一次循环的时候,谁是栈顶元素?没错,就是左节点。就是通过这种栈的特性,实现了递归的过程!
所以要能够理解,为什么有人说栈和递归是一样的。
以上过程实现了根、左、右的遍历过程,那我们想想后序遍历:左、右、根的的顺序,可不可以借鉴这个思路?可以的,我们只需要实现根、右、左的过程,再reverse一下,就OK了,是不是很骚,是的。
————————————————
原文链接:https://blog.csdn.net/ibelieve8013/article/details/103059101
import java.util.*; public class Solution { private ArrayList<Integer> list = new ArrayList<>(); public ArrayList<Integer> postorderTraversal(TreeNode root) { //迭代法 ,先实现根 右 左 再reverse //递归的本质就是栈 if (root == null) return list; Stack<TreeNode> stk = new Stack<>(); stk.push(root); while(!stk.isEmpty()){ //栈顶出来 TreeNode top = stk.pop(); list.add(top.val); //压入左再压入右--->我们访问的顺序就是根 右 左 if(top.left != null) stk.push(top.left); if(top.right!=null) stk.push(top.right); } Collections.reverse(list); return list; } }