「这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」
题目介绍
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例1
输入: p = [1,2,3], q = [1,2,3]
输出: true
示例2
输入: p = [1,2], q = [1,null,2]
输出: false
示例3
输入: p = [1,2,1], q = [1,1,2]
输出: false
提示:
- 两棵树上的节点数目都在范围
[0, 100]内 -10^4 <= Node.val <= 10^4
解题思路
思路一:深度优先遍历(递归)
比较两棵树是否相同,需要两棵树相同位置的节点同时为空,或者同时存在且节点的值相同,如果是一空一非空或者两个节点的值不相同,则不是相同的树
解题步骤
- 如果两个相同位置的节点都为空,返回
true - 如果两个节点一空一非空,或者两个节点的值不相等,返回
false - 继续比较当前节点的左节点和右节点
解题代码
var isSameTree = function(p, q) {
if (!p && !q) return true
if (p && !q || !p && q || p.val !== q.val) return false
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right)
};
思路二:广度优先遍历
解题步骤
- 将根节点
p、q插入到队列queue中 - 如果队列
queue不为空,则出队前两个节点,分别是两棵树相同位置的节点 - 如果出队的两个节点都为空节点,则继续出队接下来的两个节点
- 如果出队的两个节点为一空一非空,或者是两个节点的值不相等,直接返回
false,结束遍历 - 将两个节点的左节点分别入队
- 将两个节点的右节点分别入队
- 重复步骤 2-6,直到队列
queue为空,说明两棵树的所有节点都相同,返回true
解题代码
var isSameTree = function(p, q) {
const queue = [p, q]
while (queue.length) {
const node1 = queue.shift()
const node2 = queue.shift()
if (!node1 && !node2) continue
if (node1 && !node2 || !node1 && node2 || node1.val !== node2.val) return false
queue.push(node1.left)
queue.push(node2.left)
queue.push(node1.right)
queue.push(node2.right)
}
return true
};