一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
相同的树
题目如下图所示,也可以在LeetCode题目中找到此题。
题目解析
题目提供素材
根据题目描述,我们可以看到给出了两个参数素材。
-
二叉树p
-
二叉树q
两个二叉树的结构是一样的,节点数可能不同,并且节点树的节点数在0到100之间。
我的解读
在题目描述中,我们可以得到这道题目的预期结果:判断两个二叉树结构节点中的值是否相同。
如果相同返回true,不相同返回false。
二叉树存在属性值、左节点、右节点三个值。
通过对比每个节点的属性值即可。
解题思路
解题思路也是一样的,有两种思路。
其一是通过循环,反正最多只能有100个节点。
其二是通过递归,我本次用的也是递归方法。
在思路上,递归更方便一些,没有太大的中间值需要处理,只是转换到下一节点即可。
代码
具体代码如下:
/**
* 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;
} else if (p == null || q == null) {
return false;
} else if (p.val != q.val) {
return false;
} else {
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}
}
执行结果
这是官方给的解题代码,但是排名确实挺可怜。
优化一下
官方给的题解,是正确的,但是用来测试的示例都是一些特殊例子,所以在执行的时候,会有大多数的次数一直执行到最后一个if。
所以我们换一种判断方式,如下代码,将if提前一些。
这样就能少做几次判断。
class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
}
if (p != null && q != null && p.val == q.val) {
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
} else {
return false;
}
}
}
如此执行结果还是比较乐观的。