1.题目描述
2.思路
(1)首先检查p,q节点是不是为空;如果同时为空,则他们是相同的树
(2)p,q节点如果一个为空,一个不为空,则他们不是相同的树
(3)p,q的值不一样,则他们不是相同的树
(4)递归遍历左子树和右子树
(5)if (p.val == q.val) { return true; } 是错误的
树p
1
/ \
2 3
树q
1
/ \
2 4
1)比较 p 和 q 的根节点值:p.val == 1,q.val == 1。因为它们相等,代码会执行 return true,忽略对它们子节点的检查。
2)然而,树 p 的右子树是节点值为 3,而树 q 的右子树是节点值为 4。这两个子树显然不同。
3)该代码在根节点值相同的情况下,直接返回 true,导致错误判断树 p 和树 q 是相同的树。
4)正确的逻辑应该是:
首先检查节点值是否相等。
然后递归检查它们的左右子树是否也相同。
3.代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p==null&&q==null)
{
return true;
}
if(p==null||q==null)
{
return false;
}
// 如果两个节点的值不同,它们不是相同的树
if(p.val!=q.val)
{
return false;
}
//递归检查左右子树
return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
}
}