首页 简历|笔试面试
您现在的位置:百分网 > 职场 > 笔试面试 > LeetCode

100、相同的树

  • 25年9月4日 发布
  • 250.57KB 共4页
100、相同的树100、相同的树100、相同的树100、相同的树

100、相同的树

题意

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

难度

简单

示例

示例 1:

100.%E7%9B%B8%E5%90%8C%E7%9A%84%E6%A0%91-20231116085854.png

输入:p = [1,2,3], q = [1,2,3]

输出:true

示例 2:

100.%E7%9B%B8%E5%90%8C%E7%9A%84%E6%A0%91-20231116085943.png

输入:p = [1,2], q = [1,null,2]

输出:false

示例 3:

100.%E7%9B%B8%E5%90%8C%E7%9A%84%E6%A0%91-20231116090002.png

输入:p = [1,2,1], q = [1,1,2]

输出:false

分析

本题我们还是使用解决二叉树问题中最常用的办法——“递归”。

假设我们现在获得了两棵树的根节点(p 和 q),一眼看出他俩是相同的很难,但也有例

外,比如说两个都是 null,空树自然是一样的。

再换另外一个角度,想要一眼看出两棵树是不同的,只要 p.val != q.val,我们就能分辨

出。

至于其他的情况,就不能这么简单地分辨了,因为涉及到左子树和右子树相同的情况,但

是不要忘记——递归!

只要继续递归处理各自的左子树和右子树,问题就迎刃而解了,换句话说,p 的左子树必

然和 q 的左子树是相同的,p 的右子树必然和 q 的右子树也是相同的,而左子树和右子树

同样也是二叉树。

这时候整个算法的大概框架就浮现出来了——以递归为基础,先判断我们前面提到的两种

最直观的情况,否则就递归判断左子树和右子树!

好,来看整个题解,看一眼注释基本就明白了,非常简单。

/**

* 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 {

// 方法用于比较两个二叉树 p 和 q 是否完全相同

public boolean isSameTree(TreeNode p, TreeNode q) {

// 如果两个树都是空的,则它们相同

if (p == null && q == null) {

return true;

}

// 如果一个树为空而另一个不为空,则它们不相同

if (p == null || q == null) {

return false;

}

// 检查当前节点的值是否相等,并递归地检查左右子树

// 只有当前节点值相等且对应的左子树和右子树也都相等时,才认为整个树相等

return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right,

q.right);

}

}

因为最多只可能遍历整个树的所有节点一次,所以时间复杂度为$ O(n) $,非常优秀。

100.%E7%9B%B8%E5%90%8C%E7%9A%84%E6%A0%91-20231116091302.png

好,对于输入 p = [1,2] 和 q = [1,null,2],我们来模拟一下整个题解过程:

树 p 的结构:

1

/

2

树 q 的结构:

1

2

按照题解的方法,我们逐步比较这两棵树是否相同:

1. 初始调用 **isSameTree**:

– 首先比较根节点 p(值为 1)和根节点 q(值为 1)。它们的值相等,所以我

们继续。

2. 递归比较左子树:

– 接下来,我们比较 p 的左子树(值为 2)和 q 的左子树(null)。

– 因为 p 的左子树是非空的,而 q 的左子树是空的,所以这里它们不相同。

– 此时,方法返回 false。

3. 递归比较右子树:

– 这一步在本例中不会执行,因为一旦左子树的比较返回了 false,整个方法就

会立即返回 false。

所以,根据题解的逻辑,这两棵树不是相同的树,最终结果为 false。这是因为尽管它们

的根节点相同,但它们的左子树不同(一个是非空,另一个是空)。树的结构和节点值都

需要完全匹配,才能认为两棵树是相同的。

总结

简单的代码,简单的思路,背后蕴藏着的其实是我们不断锤炼的解题能力,100 题了,继

续加油吧。

力扣链接:https://leetcode.cn/problems/same-tree/

开通会员 本次下载免费

所有资料全部免费下载! 推荐用户付费下载获取返佣积分! 积分可以兑换商品!
一键复制 下载文档 联系客服