【LeetCode】5 二叉樹的各類非遞歸遍歷

1. 非遞歸實現二叉樹的前序遍歷

  1. Binary Tree Preorder Traversal (Medium)

Leetcode / 力扣java

public List<Integer> preorderTraversal(TreeNode root) {
    List<Integer> ret = new ArrayList<>();
    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);
    while (!stack.isEmpty()) {
        TreeNode node = stack.pop();
        if (node == null) continue;
        ret.add(node.val);
        stack.push(node.right);  // 先右後左,保證左子樹先遍歷
        stack.push(node.left);
    }
    return ret;
}Copy to clipboardErrorCopied

2. 非遞歸實現二叉樹的後序遍歷

  1. Binary Tree Postorder Traversal (Medium)

Leetcode / 力扣node

前序遍歷爲 root -> left -> right,後序遍歷爲 left -> right -> root。能夠修改前序遍歷成爲 root -> right -> left,那麼這個順序就和後序遍歷正好相反。post

public List<Integer> postorderTraversal(TreeNode root) {
    List<Integer> ret = new ArrayList<>();
    Stack<TreeNode> stack = new Stack<>();
    stack.push(root);
    while (!stack.isEmpty()) {
        TreeNode node = stack.pop();
        if (node == null) continue;
        ret.add(node.val);
        stack.push(node.left);
        stack.push(node.right);
    }
    Collections.reverse(ret);
    return ret;
}Copy to clipboardErrorCopied

3. 非遞歸實現二叉樹的中序遍歷

  1. Binary Tree Inorder Traversal (Medium)

Leetcode / 力扣code

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> ret = new ArrayList<>();
    if (root == null) return ret;
    Stack<TreeNode> stack = new Stack<>();
    TreeNode cur = root;
    while (cur != null || !stack.isEmpty()) {
        while (cur != null) {
            stack.push(cur);
            cur = cur.left;
        }
        TreeNode node = stack.pop();
        ret.add(node.val);
        cur = node.right;
    }
    return ret;
}
相關文章
相關標籤/搜索