算法学习 day23

这篇具有很好参考价值的文章主要介绍了算法学习 day23。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

669. 修剪二叉搜索树

给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代子代关系都应当保留)。 可以证明,存在 唯一的答案

所以结果应当返回修剪好的二叉搜索树的新的根节点。注意,根节点可能会根据给定的边界发生改变。

示例 1:

算法学习 day23,算法,算法,学习,python

输入:root = [1,0,2], low = 1, high = 2
输出:[1,null,2]

示例 2:

算法学习 day23,算法,算法,学习,python

输入:root = [3,0,4,null,2,null,null,1], low = 1, high = 3
输出:[3,2,null,1]

提示:

  • 树中节点数在范围 [1, 104]
  • 0 <= Node.val <= 104
  • 树中每个节点的值都是 唯一
  • 题目数据保证输入是一棵有效的二叉搜索树
  • 0 <= low <= high <= 104
递归解法
class Solution {
    public TreeNode trimBST(TreeNode root, int low, int high) {
        //终止条件
        if(root == null) return root;
        //单层循环逻辑
        //当前值小于目标值,修剪左子树,返回右子树
        if(root.val < low) return trimBST(root.right,low,high);
        //反之
        if(root.val > high) return trimBST(root.left,low,high);

        //当前值符合范围,分别修建左右子树
        root.left = trimBST(root.left,low,high);
        root.right = trimBST(root.right,low,high);
        return root;
    }
}

108.将有序数组转换为二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例 1:

算法学习 day23,算法,算法,学习,python

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:

示例 2:

算法学习 day23,算法,算法,学习,python

输入:nums = [1,3]
输出:[3,1]
解释:[1,null,3] 和 [3,1] 都是高度平衡二叉搜索树。

提示:

  • 1 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • nums严格递增 顺序排列
递归
  • 二叉搜索树按照中序(左根右)遍历,得到升序数组
  • 通过中间件节点切分得到根节点即可
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return sortedSubBST(nums,0,nums.length-1) ;
    }
    public TreeNode sortedSubBST(int[] nums,int start,int end) {
        if(start>end) return null;
        int mid = start + (end - start)/2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = sortedSubBST(nums,start,mid-1);
        root.right = sortedSubBST(nums,mid+1,end);
        return root;
    }
}

538.将二叉树搜索树转化为累加树

给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

提醒一下,二叉搜索树满足下列约束条件:

  • 节点的左子树仅包含键 小于 节点键的节点。
  • 节点的右子树仅包含键 大于 节点键的节点。
  • 左右子树也必须是二叉搜索树。

**注意:**本题和 1038: https://leetcode-cn.com/problems/binary-search-tree-to-greater-sum-tree/ 相同

示例 1:

算法学习 day23,算法,算法,学习,python

输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]
输出:[30,36,21,36,35,26,15,null,null,null,33,null,null,null,8]

示例 2:

输入:root = [0,null,1]
输出:[1,null,1]

示例 3:

输入:root = [1,0,2]
输出:[3,3,2]

示例 4:

输入:root = [3,2,4,1]
输出:[7,9,4,10]

提示:文章来源地址https://www.toymoban.com/news/detail-553135.html

  • 树中的节点数介于 0104 之间。
  • 每个节点的值介于 -104104 之间。
  • 树中的所有值 互不相同
  • 给定的树为二叉搜索树。
递归
  • 题意中的累加和理解为从大到小累加得出
  • 中序遍历的结果为从小到大,即升序,要想得到降序的数组,使用和中序相反的顺序遍历(右根左)
  • 此时根据递归三部曲
    • 参数和返回值为根节点
    • 终止条件,节点为null
    • 单层递归逻辑
      • 先遍历右子树,累加和->给右子节点赋值
      • 计算节点和
      • 最后遍历左子树
class Solution {
    int sum = 0 ;
    public TreeNode convertBST(TreeNode root) {
        if(root == null)return null;

        convertBST(root.right);
        sum += root.val;
        root.val = sum;
        convertBST(root.left);

        return root;
    }
}

到了这里,关于算法学习 day23的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习 day23(激活函数的作用,线性激活函数的不足)

    1. 线性激活函数的局限性 如果我们将神经网络模型中的所有激活函数都设为线性激活函数,那整个神经网络模型就跟线性回归模型极其相似,且它无法拟合比线性回归模型更复杂的关系 2. 激活函数全设为线性回归激活函数的例子 若把a¹带入a²,则a²可简化为wx+b,这与其使用

    2024年02月13日
    浏览(65)
  • 【100天精通python】Day23:正则表达式,基本语法与re模块详解示例

      目录  专栏导读  1 正则表达式概述 2 正则表达式语法 2.1 正则表达式语法元素

    2024年02月14日
    浏览(42)
  • 算法刷题Day 23 修剪二叉搜索树+将有序数组转换为二叉搜索树+把二叉搜索树转换为累加树

    递归 好神奇,完全凭感觉写,感觉应该过不了,结果就过了 具体是什么原理可以参考代码随想录的讲解 递归 迭代 使用三个队列来处理(感觉用三个栈也可以) 其实就是以右-中-左的顺序来处理二叉树 每次将当前节点加上上一次访问节点的新值 能想到保存前一次访问节点的

    2024年02月15日
    浏览(33)
  • 算法学习笔记(23): 马尔可夫链中的期望问题

    这个问题是我在做 [ZJOI2013] 抛硬币 - 洛谷 这道题的时候了解的一个概念。 在网上也只找到了一篇相关的内容:# 马尔可夫链中的期望问题 故在这里来分享一下其中的期望问题。 目录 马尔可夫链中的期望问题 马尔可夫链 概率转移矩阵 转移矩阵的修订 状态中的期望 期望线性

    2024年02月07日
    浏览(29)
  • 数据结构与算法基础-学习-23-图之邻接矩阵与邻接表

    目录 一、定义和术语 二、存储结构 1、邻接矩阵 1.1、邻接矩阵优点 1.2、邻接矩阵缺点 2、邻接表 3、邻接矩阵和邻接表的区别和用途 3.1、区别 3.2、用途 三、宏定义 四、结构体定义 1、邻接矩阵 2、邻接表 3、网数据类型(造测试数据) 五、函数定义 1、使用邻接矩阵创建无

    2024年02月14日
    浏览(25)
  • 算法学习day16

    104 二叉树的最大深度 给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 递归 入参:根节点 递归终止,节点为null, return 0 ; 循环条件:当前层级1+左右子节点的最大深度 返回最大深度

    2024年02月08日
    浏览(26)
  • 算法学习day14

    144. 二叉树前序遍历 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 思路(递归) 根左右,空返回 时间 O(n) 空间 O(1) 迭代 递归的本质即是“栈” 前序≈根左右,要想实现左节点先出,则需要先将右节点压入栈,入栈根-右-左,出栈:根左右 94. 二叉树中序遍历 给定一

    2024年02月08日
    浏览(25)
  • 算法学习day56

    题目描述: 给定两个单词word1和word2,找到使得word1和word2相同所需要的的最小步数,每步可以删除任意一个字符串的一个字符。 例: 输入:“sea”,“eat” 输出:2 解释:第一步将\\\"sea\\\"变为\\\"ea\\\",第二步将“eat”变成“ea” 1.确定dp数组以及下标含义 dp[i] [j] :以i-1为结尾的字符串

    2023年04月23日
    浏览(16)
  • 算法学习day59

    题目描述: 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字x的下一个更大元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,循环搜索它的下一个更大的数。如果不存在,输出-1。 例1: 输入:[1, 2

    2023年04月14日
    浏览(20)
  • 算法学习day18

    513.找树左下角的值 给定一个二叉树的 根节点 root ,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 示例 2: 提示: 二叉树的节点个数的范围是 [1,104] -231 = Node.val = 231 - 1 递归 利用最大深度,判断是否时最后一层,每次更新最大深度,不断

    2024年02月09日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包