LeetCode0145.二叉樹的後序遍歷
阿新 • • 發佈:2018-11-20
0145.二叉樹的後序遍歷
描述
給定一個二叉樹,返回它的 後序 遍歷。
例項
輸入: [1,null,2,3]
1
\
2
/
3
輸出: [3,2,1]
進階
遞迴演算法很簡單,你可以通過迭代演算法完成嗎?
題解
後序遍歷時,有如下幾種情況
root
為葉子結點 ➡️直接訪問root
為非葉子節點,但子節點未被訪問 ➡️將root
的右左孩子依次進棧root
為非葉子節點,且子節點未被訪問 ➡️直接訪問 該情況有以下可能root
有且只有左孩子,且左孩子為上一個訪問的節點root
有右孩子,且右孩子為上一個訪問的節點(實現是,由於pre初始化
為null
有可能root.right == null == pre
因此,需要加上條件為此時pre!= null
public static List<Integer> postorderTraversal(TreeNode root) {
TreeNode pre = null;
Stack<TreeNode> stack = new Stack<>();
List<Integer> result = new ArrayList<>();
if (root == null)
return result;
stack.push(root);
while (!stack.isEmpty()){
root = stack.peek();
if (root == null){
stack.pop();
continue;
}
//root為葉子結點,直接訪問
if (root.right == null && root.left == null){
root = stack.pop();
pre = root;
result.add(root.val);
continue;
}
//root為非葉子結點,但是子節點已經被訪問過,直接訪問
//root只有左孩子且pre==root.left
//或者root有右孩子且pre == root.right,此時pre不能等於null
if (((root.right == null) && (pre == root.left)) || ((root.right == pre) && (pre != null))){
root = stack.pop();
pre = root;
result.add(root.val);
continue;
}
stack.push(root.right);
stack.push(root.left);
}
return result;
}