1. 程式人生 > >二叉樹的後序非遞迴遍歷(巧妙思想...)

二叉樹的後序非遞迴遍歷(巧妙思想...)

大家都知道二叉樹的前序非遞迴遍歷非常好寫:

//二叉樹的結構
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; }