Easton Notes
LeetCode 专题灵神算法

二叉树与递归 - 灵活运用

来源:基础算法精讲 by 灵茶山艾府

视频精讲:二叉树与递归 - 灵活运用

题意与示例

100. 相同的树

题目链接:判断两棵二叉树的结构和对应节点值是否完全相同。

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

/**
 * 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) {
    // 就是一个一错全错,全不错才对的思路

    if (!p && !q) return true
    // 递归出口,这里不要因为惯性写false
    if (!p || !q) return false // 其中有一个空节点,当然是不一致,那就是false,那还需要判断一致

    // 1. 判断当前节点
    // 值不同:一错全错,直接返回 false
    // 值相同:还要继续检查子树
    if (p.val !== q.val) return false;
    // 2. 深搜,一个一个比较
    return isSameTree(p.left, q.left) && isSameTree(p.right,q.right)
    // 一边不对那就全部不对
    // 那边都对那就相当于子树相同


};

101. 对称二叉树

题目链接:判断一棵二叉树是否关于根节点左右镜像对称。

示例:输入 root = [1,2,2,3,4,4,3],输出 true。

/**
 * 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} root
 * @return {boolean}
 */
var isSymmetric = function(root) {
    // 传入了一个root,那无法比较,需要自己构造一个比较同层左右的函数



    let isMirror = function(left, right) {

        // 两边都为空,那是对称的
        if( !left && !right ) return true
        
        // 如果有一边为空,那也是不对称
        if( !left || !right ) return false 

        // 如果左右(第一层)不相同,那就不对称
        if( left.val != right.val ) return false

        // 同层val相同就是true
        // if(left.val === right.val) return true
        // 成功的true从底层传上去
        // 思考叶子节点,叶子节点下面传一个true上来


        // 假设两边子树都是中心对称的,那就需要判断左子树的左边是否等于右子树的右边
        return (
            isMirror(left.left, right.right) && 
            isMirror(left.right, right.left)
        )
    }

    return isMirror(root.left,root.right)
};

110. 平衡二叉树

题目链接:判断每个节点的左右子树高度差是否都不超过 1。

示例:输入 root = [3,9,20,null,null,15,7],输出 true。

199. 二叉树的右视图

题目链接:返回从二叉树右侧观察时由上到下能看到的节点值。

示例:输入 root = [1,2,3,null,5,null,4],输出 [1,3,4]。

226. 翻转二叉树

题目链接:交换每个节点的左右子树,得到原二叉树的镜像。

示例:输入 root = [4,2,7,1,3,6,9],输出 [4,7,2,9,6,3,1]。

617. 合并二叉树

题目链接:叠加两棵二叉树,重叠节点值相加,未重叠节点直接保留。

示例:输入 root1 = [1,3,2,5], root2 = [2,1,3,null,4,null,7],输出 [3,4,5,5,4,null,7]。

1026. 节点与其祖先之间的最大差值

题目链接:求所有祖先与后代节点值之差的绝对值中的最大值。

示例:输入 root = [8,3,10,1,6,null,14,null,null,4,7,13],输出 7。

1080. 根到叶路径上的不足节点

题目链接:删除所有不在任何路径和至少为 limit 的根到叶路径上的节点。

示例:输入 root = [1,2,3,4,-99,-99,7,8,9,-99,-99,12,13,-99,14], limit = 1,输出 [1,2,3,4,null,null,7,8,9,null,14]。

评论

On this page