1. 题目解析与核心思路
Leetcode 116题"相同的树"与"对称二叉树"是二叉树类问题中的经典题目,这两个问题看似简单,却涵盖了二叉树遍历、递归思想等核心算法概念。我们先来看题目具体要求:
相同的树:给定两棵二叉树的根节点p和q,判断这两棵树是否完全相同(结构相同且节点值相同)。
对称二叉树:给定一棵二叉树的根节点,判断这棵树是否是镜像对称的(左子树与右子树镜像对称)。
这两个问题本质上都是对二叉树结构的比较,只是比较的方式不同。相同的树是两棵树之间的比较,而对称二叉树是一棵树自身的左右子树比较。理解这一点对解题思路的形成至关重要。
1.1 问题抽象与递归思想
这类二叉树比较问题天然适合使用递归解法,因为二叉树本身就是递归定义的数据结构。每个节点的左右子树又是一棵二叉树,这种自相似的特性让我们可以:
- 定义基本情况(base case):当树为空或满足某些条件时的处理
- 定义递归情况:如何通过子问题的解来构建原问题的解
对于相同的树问题,递归思路可以描述为:
- 两棵树都为空 → 相同
- 只有一棵为空 → 不同
- 根节点值不同 → 不同
- 递归比较左子树和右子树
对于对称二叉树问题,可以转化为:
- 空树 → 对称
- 比较左子树的左子树与右子树的右子树
- 比较左子树的右子树与右子树的左子树
这种将大问题分解为相似小问题的思路,正是递归思想的精髓所在。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 递归解法实现细节
2.1 相同的树递归实现
以Python为例,相同的树递归实现非常简洁:
python复制def isSameTree(p, q):
if not p and not q:
return True
if not p or not q:
return False
if p.val != q.val:
return False
return isSameTree(p.left, q.left) and isSameTree(p.right, q.right)
这段代码完美体现了递归的三个关键要素:
- 终止条件(前两个if判断)
- 当前层处理(值比较)
- 递归调用(左右子树比较)
时间复杂度:O(n
