lintcode68-二叉樹的後序遍歷

Question:

      給出一棵二叉樹,返回其節點值的後序遍歷。
      給出一棵二叉樹 {1,#,2,3},
       1
         \
          2
         /
        3
        返回 [3,2,1]

Solution:
      二叉樹的遍歷只要記住
      1、藉助棧
      2、前序遍歷:入棧時訪問
      3、中序遍歷:彈出棧時訪問
     
      4、後續遍歷:關鍵點在於,要先訪問完左右子樹後,才能訪問當前節點
         那麼就用一個pre節點標記剛訪問過的節點,如果當前節點的右兒子爲空或者右兒子是剛剛訪問過的節點,此時彈出並訪問棧頂元素

public List<Integer> postorderTraversal(TreeNode root) {
        // write your code here
        List<Integer> result = new ArrayList<Integer>();
        if(root == null)
            return result;
        TreeNode cur = root;
        TreeNode pre = null;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        while(cur != null || !stack.isEmpty()) {
            //所有左子樹壓入站
            if(cur != null) {
                stack.push(cur);
                cur = cur.left;
            } else {
                //左子樹壓入完成,獲取棧頂元素
                cur = stack.peek();
                //右子樹爲空或右子樹已經訪問過了
                if(cur.right == null || cur.right == pre) {
                    cur = stack.pop();
                    result.add(cur.val);
                    pre = cur;
                    //cur置空,避免cur再次入棧導致循環
                    cur = null;
                } else {
                    //有右兒子沒被訪問,在下一次循環時入棧
                    cur = cur.right;
                }
            }
        }
        return result;
    }

    @Test
    public void test() {
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.left.right = new TreeNode(5);
        root.left.left = new TreeNode(4);
        root.right = new TreeNode(3);
        List<Integer> result = postorderTraversal(root);
        System.out.println(result.toString());
    }
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章