本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
输入: p = [1,2,3], q = [1,2,3]
输出: true
题目解析
思路一
我们先判断是不是都为 null,是null就一样,然后直接返回,如果不都为null,就看看是否其中之一为null,如果其中之一为null就说明不同,如果都不为null,看看值是不是一样,如果不同则树不同然后进行判断当前节点的子节点是不是为空,在把就把左右节点分别再传入进行判断
/**
* @param {TreeNode} p
* @param {TreeNode} q
* @return {boolean}
*/
var isSameTree = function(p, q) {
if(p==null&&q==null) return true;
if(p==null||q==null||p.val!=q.val) return false;
if(p.left==null&&q.left==null&&p.right==null&&q.right==null) return true;
return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
};
思路二
我们先定义p当前层级的所有节点和q当前层级的所有节点,然后进行循环,如果循环一遍后节点还有,就继续判断,在定义下一个层级p的节点集合和定义下一个层级q的节点集合,进行判断两个当前节点数量是否对等不对等,不对等就返回false,在遍历每个节点,如果两个节点集合中,有一个为null,且两个不相等,肯定不同,增加这个判断是因为null 的指针的问题,在判断两个的值是否相等,不相等就返回false,在把下一层的按照一样的顺序放到下一层级的节点集合中,没有就加个null进去,然后再声明下一级数据,循环完之后如果全部通过判断,则返回true
var isSameTree = function (p, q) {
let pa = [p]
let qa = [q]
while (pa.length || qa.length) {
let pas = []
let qas = []
if (pa.length !== qa.length) return false
for (let i = 0; i < pa.length; i++) {
if (pa[i] === null || qa[i] === null) {
if (pa[i] !== qa[i]) return false
} else {
if (pa[i].val !== qa[i].val) return false
pas.push(pa[i].left ?? null)
pas.push(pa[i].right ?? null)
qas.push(qa[i].left ?? null)
qas.push(qa[i].right ?? null)
}
}
pa = pas
qa = qas
}
return true
};