二叉树非递归后序遍历

二叉树的递归遍历非常好理解,代码也很精简。并且前序和中序的非递归遍历,也是能一眼看明白的。但是后序遍
历相对而言有点复杂,网上大多都是不怎么漂亮的解法,直到我看到一款很厉害的解法。。。

思路如下:后序遍历为 左右中,那么我们可以模仿一下前序遍历的写法(前序遍历为中左右),我们将遍历的顺序为 中右左,反过来,就可以。

Talk is cheap,show you the code!!!

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        //后序遍历为  左右中,那么我们可以模仿一下前序遍历的写法(前序遍历为中左右),
        //我们将遍历的顺序为 中右左,反过来,就可以。
        LinkedList<Integer> list = new LinkedList<>();
        Stack<TreeNode> stack = new Stack<TreeNode>();
        while(root != null || !stack.isEmpty()){
            while(root != null){
                list.addFirst(root.val);
                stack.add(root);
                root = root.right;
            }
            if(!stack.isEmpty()){
                root = stack.pop();
                root = root.left;
            }
        }
        return list;
    }
}