前端算法-相同的树

122 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

题目

给你两棵二叉树的根节点 pq ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

输入: 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,在循环中我们声明两个常量分为leftright,我们使用shift方法将出参pq取出,放到leftright常量中,然后进行判断当前的leftright常量是否为null,如果都为null则直接返回true,如果不为null则往下继续判断当前leftright常量其中一个值是否为nullleftval属性值不等于rightval值,如果其中一项是则直接返回false,如果不是则分别将leftright常量的左右节点全部使用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;
};

坚持努力,无惧未来!