Day20笔记

 

var constructMaximumBinaryTree = function(nums) {
    if (nums.length == 0) return null;
    //如果传入的数组nums为空,返回null
    //表示没有节点可以构成二叉树。
    let max = nums[0];
    //初始化max为数组中的第一个元素。
    let index = 0;
    //初始化index为0,用于记录当前最大值max的索引。
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] > max) {
            max = nums[i];
            index = i;
        }
    }
    //遍历整个数组nums,查找数组中的最大值及其索引。
    let root = new TreeNode(max);
    //用最大值max创建一个新节点作为根节点。
    root.left = constructMaximumBinaryTree(nums.slice(0, index));
    //以nums数组的左半部分(即0到index-1的元素)递归地构建左子树
    //将返回的根节点作为当前节点的左子节点。
    root.right = constructMaximumBinaryTree(nums.slice(index + 1));
    //以nums数组的右半部分(即index+1到末尾的元素)递归地构建右子树
    //将返回的根节点作为当前节点的右子节点。
    return root;
    //返回构建好的最大二叉树的根节点。
};

 

98.验证二叉搜索树

力扣题目链接

 

var isValidBST = function(root) {
    // 1. 确定递归函数参数
    const isValid = function(node, min, max) {
        // 定义一个递归函数isValid
        // 它接受一个节点node以及当前节点允许的最小值min和最大值max作为参数。
        // 2. 确定终止条件
        // 如果当前节点为空,返回true,表示当前子树符合要求。
        if(node === null) {
            return true;
        }
        // 3. 单层递归逻辑
        if(node.val <= min || node.val >= max) {
            return false;
        }
        // 如果当前节点的值小于等于最小值min或者大于等于最大值max
        // 则返回false
        // 表示当前子树不符合要求。
        return isValid(node.left, min, node.val) && isValid(node.right, node.val, max);
        // 分别以当前节点的左子节点和右子节点为根节点递归地调用isValid函数
        // 更新当前节点的最小值和最大值,直到遇到空节点或者非法节点。
        // 如果左右子树均符合要求,则返回true,否则返回
    }
    return isValid(root, -Infinity, Infinity);
    // 以根节点root为起点
    // 递归调用isValid函数
    // 判断整个二叉树是否是一个合法的二叉搜索树
    // 初始化最小值为负无穷,最大值为正无穷。
};

700.二叉搜索树中的搜索

力扣题目地址

var searchBST = function (root, val) {
    if (!root || root.val === val) {
        return root;
    }
    // 如果当前节点为空或者节点的值等于val,则直接返回当前节点
    // 这表示已经找到了目标节点或者当前二叉搜索树为空

    // 如果目标值val小于当前节点的值
    // 则说明目标节点位于当前节点的左子树中
    // 递归地在左子树中继续搜索。

    // 如果目标值val大于当前节点的值
    // 则说明目标节点位于当前节点的右子树中
    // 递归地在右子树中继续搜索。
    if (root.val > val)
        return searchBST(root.left, val);
    if (root.val < val)
        return searchBST(root.right, val);
};

617.合并二叉树

力扣题目链接

 

 

var mergeTrees = function (root1, root2) {
    const preOrder = (root1, root2) => {
        if (!root1)
            return root2
        if (!root2)
            return root1;
        root1.val += root2.val;
        root1.left = preOrder(root1.left, root2.left);
        root1.right = preOrder(root1.right, root2.right);
        return root1;
    }
    // 定义一个递归函数preOrder,它接受两个根节点root1和root2作为参数,返回合并后的新根节点。
    // 如果root1为空,则返回root2。这表示如果一个树为空,则直接返回另一个树,合并完成。
    // 如果root2为空,则返回root1。同样表示如果一个树为空,则直接返回另一个树。
    // 将两个根节点的值相加,更新root1的值。
    // 递归地将root1的左子树和root2的左子树合并,更新root1的左子树。
    // 递归地将root1的右子树和root2的右子树合并,更新root1的右子树。
    // 返回合并后的新根节点root1。
    // 以两个根节点root1和root2为起点,递归调用preOrder函数,将它们合并成一个新的二叉树,并返回合并后的根节点。
    return preOrder(root1, root2);
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值