返回
中序遍历:深入浅出的三种解法
后端
2023-11-23 03:10:23
中序遍历: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;
}
总结
递归、迭代和基于栈三种解法各有优缺点。递归解法简洁易懂,但可能存在栈溢出的风险。迭代解法效率较高,但实现逻辑相对复杂。基于栈的解法结合了递归和迭代的优点,既简单高效,又避免了栈溢出的风险。
通过对这三种解法的深入探讨,希望读者能够对二叉树中序遍历有一个全面深刻的理解。