返回
掌握LeetCode每日一题:巧用递归和栈解构二叉树前序遍历
前端
2023-10-30 23:53:06
前言
欢迎来到【小Y学算法】系列的第六天!今天,我们将深入剖析一道LeetCode经典题目——39. 二叉树的前序遍历。通过探索递归和栈这两种巧妙的解法,我们将揭开前序遍历的神秘面纱,带你轻松征服这道题!
什么是二叉树前序遍历?
在二叉树的前序遍历中,我们按照根结点 -> 左子树 -> 右子树 的顺序访问每个结点。也就是说,先访问根结点,然后递归地访问左子树的所有结点,最后再递归地访问右子树的所有结点。
递归解法
递归的思想是将问题分解成较小的子问题,然后逐步解决这些子问题。对于前序遍历,我们可以将二叉树分解成根结点、左子树和右子树三个部分。
def preorderTraversal(root):
if not root:
return []
result = []
result.append(root.val)
result.extend(preorderTraversal(root.left))
result.extend(preorderTraversal(root.right))
return result
栈解法
栈是一种先进后出(LIFO)的数据结构。它非常适合用于前序遍历,因为前序遍历的顺序与栈中元素出栈的顺序完全一致。
def preorderTraversal(root):
if not root:
return []
stack = [root]
result = []
while stack:
node = stack.pop()
result.append(node.val)
if node.right:
stack.append(node.right)
if node.left:
stack.append(node.left)
return result
LeetCode示例
现在,让我们来看一个LeetCode的示例:
输入:
1
/ \
2 3
/ \
4 5
输出:[1,2,4,5,3]
使用递归解法:
# 定义二叉树结点类
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
# 创建二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
# 前序遍历二叉树
result = preorderTraversal(root)
print(result) # 输出:[1, 2, 4, 5, 3]
使用栈解法:
# 定义二叉树结点类
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
# 创建二叉树
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
# 前序遍历二叉树
result = preorderTraversal(root)
print(result) # 输出:[1, 2, 4, 5, 3]
总结
通过递归和栈这两种不同的解法,我们深入理解了二叉树的前序遍历。两种解法各有优缺点,递归解法较为简洁直观,而栈解法在处理大型二叉树时效率更高。
希望今天的讲解能帮助你轻松应对LeetCode每日一题中的二叉树前序遍历题目。持续关注【小Y学算法】系列,解锁更多算法秘籍!