Skip to content

100 相同的树

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

题解

和对称二叉树类似,我们可以利用二叉树的后序遍历来解答。

递归的三部曲(来自程序员卡尔),递归的参数,递归的终止条件以及递归的单层逻辑

递归的参数,返回值是boolean类型

递归的终止条件

javascript
var isSameSingle = function(p, q) {
    if (!p && !q) {
        //都是空,合法
        return true
    } else if((p && !q) || (!p && q)) {
        //只有一个为空
        return false
    } else if(p.val !== q.val) {
        return false
    }
    //如果还是相同,那要递归了
}

递归的逻辑

递归的逻辑就是同时看两颗树的左子树是否一样,并且右子树是否一样。

javascript
var isSameTreeLeft = isSameTree(p.left, q.left)
var isSameTreeRight = isSameTree(p.right, q.right)

return isSameTreeLeft && isSameTreeRight

整体上来说,代码如下

javascript
var isSameTree = function(p, q) {
    if (!p && !q) {
        //都是空,合法
        return true
    } else if((p && !q) || (!p && q)) {
        //只有一个为空
        return false
    } else if(p.val !== q.val) {
        return false
    }
    var isSameTreeLeft = isSameTree(p.left, q.left)
    var isSameTreeRight = isSameTree(p.right, q.right)

    return isSameTreeLeft && isSameTreeRight
}

非递归方法

同样,我们可以利用队列或者栈来实现。类似于前序遍历实现后序遍历那种。

javascript
const isSameTree = function(p, q) {
    const queue = []
    //var result = true
    queue.push(p)
    queue.push(q)

    while(queue.length) {
        const currentP = queue.shift()
        const currentQ = queue.shift()

        if(!currentP && !currentQ) {
            //继续循环
            continue;
        }

        //和上面一样判断逻辑
        if((currentP && !currentQ) || (!currentP && currentQ)) {
            //只有一个为空
            return false
        } else if(currentP.val !== currentQ.val) {
            return false
        }
        
        // 先左子树入队列
        queue.push(currentP.left)
        queue.push(currentQ.left)

        // 后右子树入队列
        queue.push(currentP.right)
        queue.push(currentQ.right)
    }

    return true
}

上次更新于: