返回

中序遍历:深入浅出的三种解法

后端

中序遍历:LeetCode 0094,深入浅出的三种解法

在计算机科学领域,树形结构是广泛应用的数据结构之一,广泛用于组织、搜索和存储数据。其中,二叉树作为树形结构的一种基本形式,在实际应用中尤为常见。而二叉树的遍历,则是掌握树形结构的基础操作之一。本文将以 LeetCode 0094 为例,深入浅出地介绍二叉树中序遍历的三种解法,帮助读者全面理解这一重要概念。

中序遍历

中序遍历是一种深度优先搜索算法,它以一种特定的顺序访问二叉树中的节点:左子树 -> 根节点 -> 右子树 。对于给定的二叉树,中序遍历的结果将形成一个递增排序的序列。

解法一:递归

递归是一种将问题分解为更小规模的子问题的编程范式。对于二叉树中序遍历,我们可以使用递归如下实现:

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> result = new ArrayList<>();
    inorderTraversalHelper(root, result);
    return result;
}

private void inorderTraversalHelper(TreeNode node, List<Integer> result) {
    if (node == null) {
        return;
    }
    inorderTraversalHelper(node.left, result);
    result.add(node.val);
    inorderTraversalHelper(node.right, result);
}

解法二:迭代

迭代是一种使用循环而非递归来解决问题的编程范式。对于二叉树中序遍历,我们可以使用迭代如下实现:

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> result = new ArrayList<>();
    Stack<TreeNode> stack = new Stack<>();

    while (!stack.isEmpty() || root != null) {
        while (root != null) {
            stack.push(root);
            root = root.left;
        }

        root = stack.pop();
        result.add(root.val);
        root = root.right;
    }

    return result;
}

解法三:基于栈

基于栈的解法与迭代解法类似,但它使用显式的栈数据结构来管理遍历状态。对于二叉树中序遍历,我们可以使用基于栈的解法如下实现:

public List<Integer> inorderTraversal(TreeNode root) {
    List<Integer> result = new ArrayList<>();
    Deque<TreeNode> stack = new LinkedList<>();

    while (!stack.isEmpty() || root != null) {
        while (root != null) {
            stack.push(root);
            root = root.left;
        }

        root = stack.pop();
        result.add(root.val);
        root = root.right;
    }

    return result;
}

总结

递归、迭代和基于栈三种解法各有优缺点。递归解法简洁易懂,但可能存在栈溢出的风险。迭代解法效率较高,但实现逻辑相对复杂。基于栈的解法结合了递归和迭代的优点,既简单高效,又避免了栈溢出的风险。

通过对这三种解法的深入探讨,希望读者能够对二叉树中序遍历有一个全面深刻的理解。