LeetCode100、相同的树

160 阅读2分钟

LeetCode 系列记录我学习算法的过程。

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情

题目

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

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

示例:

image.png

输入: p = [1,2,3], q = [1,2,3]
输出: true

image.png

输入: p = [1,2], q = [1,null,2]
输出: false

提示

  • 两棵树上的节点数目都在范围 [0, 100] 内
  • 104-10^4 <= Node.val <= 10410^4

思路

这个题目需要判断两树是否相同,本来打算利用之前中序遍历二叉树的方法

将两棵树遍历后的值进行比较然后得出结果,但是发现并不行,因为中序遍历的结果相同并不能代表两树相同

因为确定一个二叉树至少要中序再加上先序或后序中的一种

但是这题可以借鉴中序遍历的思路,同时对两颗树进行遍历,将对应节点一一对比:

  • 首先定义一个标识符 flag 来标识两树是否相同
  • 定义递归函数,接受两个二叉树参数
  • 首先判断标识符是否为 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) {
    // 定义标识符,p q 是否相同
    let flag = true

    // 递归函数进行判断
    function func(tree1, tree2) {
        // 如果标识符为 false 结束递归
        if(!flag) return
        // 当 tree1 为 null 时
        if(!tree1) {
            // 判断 tree2 不为 null 那肯定不相同,赋值标识符为 false
            if(tree2) flag = false
            // 结束递归
            return
        }
        // 当 tree2 为 null 时,同上操作
        if(!tree2) {
            if(tree1) flag = false
            return
        }
        // 如果当前两节点值不同,赋值 false
        if(tree1.val !== tree2.val) flag = false
        // 递归左子树
        func(tree1.left, tree2.left)
        // 递归右子树
        func(tree1.right, tree2.right)
    }
    // 调用递归函数
    func(p, q)
    // 返回标识符值
    return flag
};

image.png

优化

其实并不需要重新定义一个递归函数,直接将当前函数当成递归函数进行处理会更简洁

var isSameTree = function(p, q) {
    // 两树均 null 返回 true
    if (!p && !q) return true
    // 只有一树 null 返回 false
    if (!p || !q) return false
    // 节点值不同 返回 false
    if (p.val !== q.val) return false
    // 最后返回递归 左右子树 的值
    return isSameTree(p.left, q.left) && isSameTree(p.right, q.right)
};

image.png