思路大概是分别找出节点相同和不相同的条件,再根据这些条件确定返回结果还是递归。
起初我列出的条件太过复杂,既要判断当前两个节点的情况又要判断其左右节点的情况,代码写了一大堆可是仍然有考虑不周全的情况。后来仔细想了想,尽量将复杂的判断条件简单化,即:每次递归只判断当前两个节点的情况,子节点的情况留给下一次递归去做。于是给出以下判断条件:
(先根据空节点情况判断)
1.两个节点同时为空,返回true(到底了不需要继续递归)
2.两个节点不同时为空(一个为空一个不为空),一定不相同,返回false
(前两个条件排除了节点为空的可能性,接下来判断节点的值是否相等)
3.节点的值相等,则递归判断左右节点
4.两个节点的值不想等,返回false。
代码如下:
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 isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
return false;
}
网友评论