代码解析 | 豆包MarsCode AI刷题

50 阅读3分钟

题目解析

我们选择一道经典的二叉树遍历题目:“给定一个二叉树,实现先序遍历、中序遍历和后序遍历,并输出遍历结果。”

思路:

• 先序遍历(Preorder Traversal):先访问根节点,然后递归地先序遍历左子树,最后递归地先序遍历右子树。其基本思想是根节点始终在左子树和右子树访问之前被访问。

• 中序遍历(Inorder Traversal):先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。中序遍历会按照节点值从小到大(对于二叉搜索树)的顺序访问节点。

• 后序遍历(Postorder Traversal):先递归地后序遍历左子树,再递归地后序遍历右子树,最后访问根节点。后序遍历常用于计算二叉树节点的一些属性,如释放节点内存等操作,因为在访问根节点时,其左右子树都已经处理完毕。

图解:

假设我们有如下简单二叉树: 1 /
2 3 / \ /
4 5 6 7 • 先序遍历:

• 从根节点1开始,先访问1。

• 然后递归到左子树,先访问2。

• 再递归到2的左子树,访问4。

• 4没有左子树和右子树,回溯到2,访问2的右子树5。

• 5没有子树,回溯到1,访问1的右子树3。

• 递归到3的左子树,访问6。

• 6没有子树,访问3的右子树7。

• 最终先序遍历结果为:1, 2, 4, 5, 3, 6, 7。

• 中序遍历:

• 先递归到左子树,从最左边的节点4开始。

• 访问4后,回溯到2,访问2。

• 然后访问2的右子树5。

• 5访问完后,回溯到1,访问1。

• 接着递归到1的右子树,先访问3的左子树6。

• 访问6后,访问3。

• 最后访问3的右子树7。

• 中序遍历结果为:4, 2, 5, 1, 6, 3, 7。

• 后序遍历:

• 先递归到左子树,从最左边的节点4开始。

• 4没有子树,回溯到2,访问2的右子树5。

• 5访问完后,访问2。

• 然后递归到1的右子树,先访问3的左子树6。

• 6访问完后,访问3的右子树7。

• 7访问完后,访问3。

• 最后访问根节点1。

• 后序遍历结果为:4, 5, 2, 6, 7, 3, 1。

代码详解(使用Python实现):

定义二叉树节点类

class TreeNode: def init(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right

先序遍历函数

def preorderTraversal(root): result = [] def preorder(root): if root: result.append(root.val) # 访问根节点,将值添加到结果列表 preorder(root.left) # 递归遍历左子树 preorder(root.right) # 递归遍历右子树 preorder(root) return result

中序遍历函数

def inorderTraversal(root): result = [] def inorder(root): if root: inorder(root.left) # 递归遍历左子树 result.append(root.val) # 访问根节点,将值添加到结果列表 inorder(root.right) # 递归遍历右子树 inorder(root) return result

后序遍历函数

def postorderTraversal(root): result = [] def postorder(root): if root: postorder(root.left) # 递归遍历左子树 postorder(root.right) # 递归遍历右子树 result.append(root.val) # 访问根节点,将值添加到结果列表 postorder(root) return result 在上述代码中,我们定义了一个二叉树节点类TreeNode,然后分别实现了先序遍历、中序遍历和后序遍历的函数。每个函数内部都使用了内部函数来实现递归遍历的逻辑,通过判断节点是否为空来决定是否继续递归。在遍历过程中,按照相应的遍历顺序访问节点并将节点值添加到结果列表中,最后返回结果列表。这样就完成了对二叉树三种遍历方式的实现。通过对这道题目的解析,我们可以更好地理解二叉树的结构和遍历算法的实现原理,为进一步学习二叉树相关知识打下坚实基础。