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());
}
}