给你两棵二叉树的根节点 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
方法一:深度优先
/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} p
* @param {TreeNode} q
* @return {boolean}
*/
var isSameTree = function(p, q) {
// 如果两棵二叉树的根节点都为空,说明它们相同
if (!p && !q) return true;
// 如果两棵二叉树中有一棵树的根节点为空,说明它们不相同
if (!p || !q) return false;
// 如果两棵二叉树的根节点的值不相同,说明它们不相同
if (p.val !== q.val) return false;
// 递归地比较两棵二叉树的左右子树是否相同
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
};
方法二:广度优先
function isSameTree(p, q) {
// 如果两棵树都为空,则它们相同
if (p === null && q === null) {
return true;
// 如果其中一棵树为空,另一棵不为空,则它们不相同
} else if (p === null || q === null) {
return false;
}
// 创建两个队列来存储树节点
const queue1 = []; // 存储树 p 的节点
const queue2 = []; // 存储树 q 的节点
// 将根节点加入队列
queue1.push(p);
queue2.push(q);
// 使用广度优先搜索遍历树节点,同时比较对应节点的值
while (queue1.length > 0 && queue2.length > 0) {
// 从队列中取出当前节点
const node1 = queue1.shift();
const node2 = queue2.shift();
// 比较当前节点的值是否相同,如果不同则返回 false
if (node1.val !== node2.val) {
return false;
}
// 获取当前节点的左右子节点
const left1 = node1.left, right1 = node1.right, left2 = node2.left, right2 = node2.right;
// 检查左子节点是否存在情况不同的情况
if ((left1 === null) !== (left2 === null)) {
return false;
}
// 检查右子节点是否存在情况不同的情况
if ((right1 === null) !== (right2 === null)) {
return false;
}
// 如果左子节点存在,则将其加入队列
if (left1 !== null) {
queue1.push(left1);
}
// 如果右子节点存在,则将其加入队列
if (right1 !== null) {
queue1.push(right1);
}
// 同样操作,将树 q 对应的左右子节点加入队列
if (left2 !== null) {
queue2.push(left2);
}
if (right2 !== null) {
queue2.push(right2);
}
}
// 如果两个队列都为空,则树相同,否则不同
return queue1.length === 0 && queue2.length === 0;
}
来源:力扣(LeetCode)