如果是前序遍历,我们的顺序是根节点,左节点,右节点。如果我们用一个栈来实现,可以这样考虑:先把根节点压入栈,在栈中有元素的时候循环:每次弹出栈顶元素,然后先压入栈顶元素的右边节点,再压入栈顶元素的左边节点。
因为栈是先进后出,因此要先压入右边的节点,因此第二次执行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;
}
}


京公网安备 11010502036488号