二叉樹的後序非遞迴遍歷(巧妙思想...)
阿新 • • 發佈:2019-01-31
大家都知道二叉樹的前序非遞迴遍歷非常好寫:
//二叉樹的結構
public class TreeNode {
TreeNode left;
TreeNode right;
int val;
TreeNode(int val) {
this.val = val;
left = right = null;
}
}
首先判斷根是否為空,將根節點入棧
1.若棧為空,則退出迴圈
2.將棧頂元素彈出,訪問彈出的節點
3.若彈出的節點的右孩子不為空則將右孩子入棧
4.若彈出的節點的左孩子不為空則將左孩子入棧
5.返回1
void preOrder(){
Stack<TreeNode> stack = new Stack<TreeNode>();
if (root != null) {
stack.push(root);
while (!stack.isEmpty()) {
root = stack.pop();
visit(root);
if (root.right != null) {
stack.push(root.right);
}
if (root.left != null) {
stack.push(root.left);
}
}
}
}
而二叉樹的後序非遞迴遍歷就比較難寫,因為涉及到判斷節點的訪問狀態…
現在有個很巧妙的方法:
前序:根->左->右
後序:左->右->根
那麼可以把後序當作:根->右->左,然後再反轉一下即可。
ArrayList<Integer> postOrder(TreeNode root) {
ArrayList<Integer> list = new ArrayList<Integer>();
if (root != null) {
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
list.add(node.val);
if (node.left != null) {
stack.push(node.left);
}
if (node.right != null) {
stack.push(node.right);
}
}
//反轉
Collections.reverse(list);
}
return list;
}