持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
题目
给你两棵二叉树的根节点
p和q,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
输入: p = [1,2,3], q = [1,2,3]
输出: true
题解
这里是判断当前两个数组中的数是否都是相同的,由于我们不确定里面会有多少数据,所以我们使用递归进行实现,我们先判断出参
p和出参q是不是都为null,如果都为null则直接返回true,因为这两个数组一样,没有则继续往下判断,当前出参p或出参q其中一个是否为null,如果其中一个为null则返回false,没有则继续判断当前出参p的值和出参q的值是不是不相等,如果不相等则直接返回false,否则将出参p的左节点和出参q的左节点传给自身进行判断,右节点也如此,最后看这两个自身函数返回的值,如果都一样那就是true,如果不是则为false
/**
* @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) return false;
if (p.val !== q.val) return false;
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
};
我们这里还可以采用迭代的方式来实现,我们先声明一个常量
stack,它是一个栈,我们在将出参p和出参q全部都放到stack栈中,然后使用循环去循环stack,在循环中我们声明两个常量分为left和right,我们使用shift方法将出参p和q取出,放到left和right常量中,然后进行判断当前的left和right常量是否为null,如果都为null则直接返回true,如果不为null则往下继续判断当前left或right常量其中一个值是否为null或left的val属性值不等于right的val值,如果其中一项是则直接返回false,如果不是则分别将left和right常量的左右节点全部使用push方法追加到stack栈中,待循环结束后,如果还没有返回false则直接返回true
var isSameTree = function(p, q) {
const stack = [p,q];
while (stack.length) {
const left = stack.shift();
const right = stack.shift();
if (left === null && right === null) {
return true;
}
if (left === null || right === null || left.val !== right.val) {
return false;
}
stack.push(left.left);
stack.push(right.left);
stack.push(left.right);
stack.push(right.right);
}
return true;
};
坚持努力,无惧未来!