当前位置: 首页 > news >正文

Day23:LeedCode 669. 修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树

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

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

示例 1:

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

思路:

root.val<low:右子树可能存在满足要求的值,将修建后的右子树返回

root.val>high:左子树可能存在满足要求的值,将修剪后的左子树返回

low<=root.val<=high:左右子树都可能存在满足要求的值,修建左右子树,返回root
递归三部曲:

1.确定返回值和参数类型

因为是要遍历整棵树,做修改,其实不需要返回值也可以,我们也可以完成修剪(其实就是从二叉树中移除节点)的操作。

但是有返回值,更方便,可以通过递归函数的返回值来移除节点。

2.确定递归结束条件:

遇到空结点返回

3.确定单层递归逻辑:

root.val<low:右子树可能存在满足要求的值,将修建后的右子树返回

root.val>high:左子树可能存在满足要求的值,将修剪后的左子树返回

low<=root.val<=high:左右子树都可能存在满足要求的值,修建左右子树,返回root

代码参考:

class Solution {TreeNode trimBST(TreeNode root, int low, int high) {if(root==null)return null;if(root.val>high) return trimBST(root.left,low,high);if(root.val<low) return trimBST(root.right,low,high);root.left=trimBST(root.left,low,high);root.right=trimBST(root.right,low,high);return root;}
};

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

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 

平衡

 二叉搜索树。

示例 1:

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

 思路:将数组中间位置的数构建成新结点,将该数组一分为二构造左子树和右子树

代码参考:

class Solution {public TreeNode sortedArrayToBST(int[] nums) {if(nums.length==0) return null;//寻找中间结点int mid=nums.length/2;//分割结点int[]left=Arrays.copyOfRange(nums,0,mid);int[]right=Arrays.copyOfRange(nums,mid+1,nums.length);TreeNode root=new  TreeNode(nums[mid]);root.left= sortedArrayToBST(left);root.right=sortedArrayToBST(right);return root;}
}

538. 把二叉搜索树转换为累加树

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

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

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

注意:本题和 1038: . - 力扣(LeetCode) 相同

示例 1:

输入:[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]

思路:中序遍历二叉搜索树能得到一串递增的数字,本题采用右中左遍历,用两个指针一个指向当前结点一个指向前一节点实现累计效果

递归三部曲:

1.返回值和参数类型

不需要递归函数的返回值做什么操作了,要遍历整棵树。

2.确定结束条件

遇空就终止。

3.单层递归逻辑

要右中左来遍历二叉树, 中节点的处理逻辑就是让cur的数值加上前一个节点的数值。

代码参考:

class Solution {TreeNode pre=null;public void travel(TreeNode root){if(root==null) return ;travel(root.right);//不是第一个结点,当前结点值更新为前一结点加现在的结点值if(pre!=null)root.val=root.val+pre.val;pre=root;//更新上一结点travel(root.left);}public TreeNode convertBST(TreeNode root) {travel(root);return root;}
}

相关文章:

  • 八大技术趋势案例(云计算大数据)
  • RabbitMQ中的交换机
  • Docker版本:18.06.1安装
  • 网络:udptcp套接字
  • Linux shell编程学习笔记42:md5sum
  • 傅立叶之美:深入研究傅里叶分析背后的原理和数学
  • LeetCode 面试经典150题 290.单词规律
  • 虚拟机-从头配置Ubuntu18.04(包括anaconda,cuda,cudnn,pycharm,ros,vscode)
  • 如何调试Clang源码
  • Llama模型下载
  • 双进程交互实现App自动重启
  • 电脑突然死机怎么办?
  • axios发送get请求但参数中有数组导致请求路径多出了“[]“的处理办法
  • 纯分享万岳外卖跑腿系统客户端源码uniapp目录结构示意图
  • sql造数据
  • 【刷算法】从上往下打印二叉树
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Angular 响应式表单之下拉框
  • chrome扩展demo1-小时钟
  • CSS3 变换
  • Hibernate最全面试题
  • javascript从右向左截取指定位数字符的3种方法
  • java第三方包学习之lombok
  • linux安装openssl、swoole等扩展的具体步骤
  • magento 货币换算
  • Python3爬取英雄联盟英雄皮肤大图
  • Python连接Oracle
  • vue-router的history模式发布配置
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 从PHP迁移至Golang - 基础篇
  • 第2章 网络文档
  • 服务器从安装到部署全过程(二)
  • 高性能JavaScript阅读简记(三)
  • 后端_ThinkPHP5
  • 计算机常识 - 收藏集 - 掘金
  • 排序算法学习笔记
  • 如何学习JavaEE,项目又该如何做?
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 推荐一个React的管理后台框架
  • 网络应用优化——时延与带宽
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 正则表达式小结
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • #include
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (3)(3.5) 遥测无线电区域条例
  • (C++17) optional的使用
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (办公)springboot配置aop处理请求.
  • (笔试题)合法字符串
  • (动态规划)5. 最长回文子串 java解决