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

【算法训练营Day18】二叉树part8

文章目录

  • 修剪二叉搜索树
  • 将有序数组转换为二叉搜索树
  • 把二叉搜索树转换为累加树

修剪二叉搜索树

题目链接:669. 修剪二叉搜索树

解题逻辑:

因为在删除的同时要保证相对结构,所以我们不能沿用上一篇文章中的删除逻辑,新的删除逻辑为:

  • 如果是叶子节点且不在范围内,直接删除
  • 如果该节点值小于最小值,则返回该节点的右子树(因为右子树大于最小值,此时右子树中不符合条件的值已经被删除了)
  • 如果该节点值大于最大值,则返回该节点的左子树(因为左子树小于最大值,此时左子树中不符合条件的值已经被删除了)

代码如下:

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

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

题目链接:108. 将有序数组转换为二叉搜索树

本题是根据一个有序数组创建一个平衡的二叉搜索树,核心思想就是:将数组从nums.length / 2开始切分,nums.length / 2索引对应的数值作为当前节点的值,左边的为左子树的节点值、右边为右子树的节点值。这样递归切分构造,最后得到的一定是一个平衡的二叉搜索树。

代码如下:

class Solution {public TreeNode sortedArrayToBST(int[] nums) {if(nums.length == 0) return null;int devide = nums.length / 2;TreeNode left = sortedArrayToBST(Arrays.copyOfRange(nums, 0, devide));TreeNode right;if(devide + 1 >= nums.length) right = sortedArrayToBST(new int[0]);else right = sortedArrayToBST(Arrays.copyOfRange(nums, devide + 1, nums.length));TreeNode node = new TreeNode(nums[devide]);node.left = left;node.right = right;return node;}
}

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

题目链接:538. 把二叉搜索树转换为累加树

解题逻辑:

我们直接使用中序遍历是从小到大遍历,此时数值不好做累加(因为后面的值我们都不知道)。所以我们可以将整个二叉搜索树进行翻转,然后再使用中序遍历修改节点,此时是从大到小遍历,累加值是已知的,所以节点的值更好累加。构造完之后,再翻转一次还原即可。

代码如下:

class Solution {int num = 0;public TreeNode convertBST(TreeNode root) {reverseBST(root);changeBST(root);reverseBST(root);return root;}public void changeBST(TreeNode root){if(root == null) return;changeBST(root.left);int history = root.val;root.val += num;num += history;changeBST(root.right);}public void reverseBST(TreeNode root){if(root == null) return;reverseBST(root.left);reverseBST(root.right);TreeNode temp = root.left;root.left = root.right;root.right = temp;}
}
http://www.dtcms.com/a/305085.html

相关文章:

  • BOSMA博冠推出8K广播级讯道摄像机DC0300 EFP
  • 项目开发需求管理
  • 项目目标如何设定?遵循的主要原则分析
  • unity 使用PropertyDrawer 在Inspector 面板上自定义字段的显示方式
  • Android User版本默认用test-keys,如何改用release-keys
  • IDDR原语基本使用
  • 【三桥君】AI技术发展下,单智能体局限性凸显,如何通过MCP和A2A协议实现智能体团队协作转变?
  • Day 25:异常处理
  • GitLab的安装及使用
  • 嵌入式第十四课!!!指针在字符数组的应用与数组指针
  • 【Lua】题目小练3
  • 13、select_points_object_model_3d解析
  • Excel制作滑珠图、哑铃图
  • HCIP--MGRE综合实验
  • 从0到1学PHP(五):PHP 数组:高效存储与处理数据
  • C#_ArrayList动态数组
  • 【C#获取高精度时间】
  • 同一个局域网段,如何实现所有用户都可以访问本地mysql数据库?
  • 理解Transformer解码器
  • 【三桥君】企业级AI应用需要系统工程支撑,如何通过MCP大模型架构实现全链路实战解构?
  • 1 RAG三问
  • Javaweb————HTTP请求头属性讲解
  • ​第七篇:Python数据库编程与ORM实践
  • Python的‌列表推导式‌
  • 065_线程创建方式(继承Thread / 实现Runnable Callable)
  • Hyperchain账本数据存储机制详解
  • SpringCloud之Gateway
  • ORACLE的用户维护与权限操作
  • 车载刷写架构 --- 整车刷写中为何增加了ECU 队列刷写策略?
  • 激光雷达/相机一体机 时间同步和空间标定(1)