1. 程式人生 > >leetcode刷題之旅(145)二叉樹的後序遍歷

leetcode刷題之旅(145)二叉樹的後序遍歷

題目描述

給定一個二叉樹,返回它的 後序 遍歷。

樣例

輸入: [1,null,2,3]  
   1
    \
     2
    /
   3 

輸出: [3,2,1]

思路分析

方法一:遞迴,按照後序遍歷“左右根”的順序,依次遍歷,遞迴即可

方法二:迴圈寫法,寫法類似先序和中序,但新增的list時用了頭插,實際遍歷順序為右根左

方法三:利用雙棧,一個棧進行右根左的遍歷,另一棧儲存值,由於是先進後出,出棧順序就是後序遍歷的順序了

方法四:雙指標法

程式碼及結果

方法一:

public List<Integer> postorderTraversal(TreeNode root) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		if (root == null) {
			return list;
		}
		return postorderTraversal(root, list);
	}
	public List<Integer> postorderTraversal(TreeNode root,ArrayList<Integer> list) {
		if (root != null) {
			if (root.left != null) {
				postorderTraversal(root.left, list);
			}
			if (root.right != null) {
				postorderTraversal(root.right, list);
			}
			list.add(root.val);
		}
		return list;
	}

方法二:

public List<Integer> postorderTraversal(TreeNode root) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		if (root == null) {
			return list;
		}
		Stack<TreeNode> stack = new Stack<TreeNode>();
		TreeNode temp = root;
		while (!stack.isEmpty() || temp != null) {
            while (temp != null) {
                stack.push(temp);
                list.add(0, temp.val);
                temp = temp.right;
            } 
            
                temp = stack.pop();
                temp = temp.left;           
            
        }
		return list;
	}