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

代码随想录算法训练营| 669. 修剪二叉搜索树 、 108.将有序数组转换为二叉搜索树 、 538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 

题目

参考文章

思路:这题其实就是删除不符合上下边界的节点。注意:这里删除不符合上下边界节点时,这个不符合上下边界的节点的左或右子树可能存在符合上下边界的节点,所i有每次比较完之后,要继续遍历其左或右子树,直到把所有不符合上下边界的节点都删除为止

代码:

class Solution {public TreeNode trimBST(TreeNode root, int low, int high) {if (root == null) {return null;}if (root.val < low) {return trimBST(root.right, low, high); //当当前节点值小于下边界时,就直接继续遍历当前节点的右子树即可,找到符合上下边界的值}if (root.val > high) {//当当前节点值大于上边界时,就直接继续遍历当前节点的左子树即可,找到符合上下边界的值return trimBST(root.left, low, high);}// root在[low,high]范围内//接入如何条件的左右孩子root.left = trimBST(root.left, low, high);root.right = trimBST(root.right, low, high);return root;}
}

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

题目

参考文章

思路:这道题目是构造平衡二叉搜索树,所以我们构造的时候,不能只在节点的某一边构造。因此我们要从数组的中间位置开始构造根节点,我们采用左闭右开的方式。因为是左闭右开,所以非法条件为 left>=right;然后每次取中间数组位置构建值,构建完后又继续构建左右节点

代码:

class Solution {public TreeNode sortedArrayToBST(int[] nums) {return sortedArrayToBST(nums, 0, nums.length);}public TreeNode sortedArrayToBST(int[] nums, int left, int right) {if (left >= right) {return null;}if (right - left == 1) {//当遍历到当前数组的的下标位置相差1时,表示已经在数组边界,所以直接构建节点返回即可return new TreeNode(nums[left]);}int mid = left + (right - left) / 2;TreeNode root = new TreeNode(nums[mid]);root.left = sortedArrayToBST(nums, left, mid);root.right = sortedArrayToBST(nums, mid + 1, right);return root;}
}

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

题目

参考文章

思路:这题目的意思就是让我们从这个二叉搜索树从大到小遍历,原来左中右的情况是从小到大遍历,所以从大到小遍历就是右中左。了解这个这题目就很好解决了。这里设置一个int sum,用于存储累加值,而且每次累加后,当前记得的值就更新为sum(题目要求),按右中左去遍历即可

代码:

class Solution {int sum;public TreeNode convertBST(TreeNode root) {sum = 0;convertBST1(root);return root;}// 按右中左顺序遍历,累加即可public void convertBST1(TreeNode root) {if (root == null) {return;}convertBST1(root.right);sum += root.val;root.val = sum;convertBST1(root.left);}
}

二叉树总结

在二叉树题目选择什么遍历顺序是不少同学头疼的事情,我们做了这么多二叉树的题目了,Carl给大家大体分分类

  • 涉及到二叉树的构造,无论普通二叉树还是二叉搜索树一定前序,都是先构造中节点。

  • 求普通二叉树的属性,一般是后序,一般要通过递归函数的返回值做计算。

  • 求二叉搜索树的属性,一定是中序了,要不白瞎了有序性了。

注意在普通二叉树的属性中,我用的是一般为后序,例如单纯求深度就用前序,二叉树:找所有路径 (opens new window)也用了前序,这是为了方便让父节点指向子节点。

所以求普通二叉树的属性还是要具体问题具体分析。

http://www.lryc.cn/news/459659.html

相关文章:

  • Django模型实现外键自关联
  • Android ViewModel
  • 优先算法1--双指针
  • 利用弹性盒子完成移动端布局(第二次实验作业)
  • C# 字符串(string)三个不同的处理方法:IsNullOrEmpty、IsInterned 、IsNullOrWhiteSpace
  • 读书笔记 - 虚拟化技术 - 0 QEMU/KVM概述与历史
  • 常见的负载均衡
  • 利用sessionStorage收集用户访问信息,然后传递给后端
  • 什么是Qseven?模块电脑(核心板)规范标准简介二
  • leetcode数组(三)-有序数组的平方
  • HCIP-HarmonyOS Application Developer 习题(五)
  • 【详细教程】如何使用YOLOv11进行图像与视频的目标检测
  • H7-TOOL的LUA小程序教程第14期:任意波形信号发生器,0-20mA输出和微型数控电源(2024-10-11,已更新)
  • Redis面试篇3
  • 集成方案 | 借助 Microsoft Copilot for Sales 与 Docusign,加速销售流程!
  • k8s 1.28.2 集群部署 MinIO 分布式集群
  • HAL库常用的函数:
  • 如何捕捉行情爆发的前兆
  • 【万字长文】Word2Vec计算详解(一)CBOW模型
  • React Native源码学习
  • 【计网】从零开始认识https协议 --- 保证安全的网络通信
  • Ubuntu安装 MySQL【亲测有效】
  • Unity 从零开始搭建一套简单易用的UGUI小框架 扩展与优化篇(完结)
  • MySQL多表操作--外键约束多表关系
  • 【python入门到精通专题】8.装饰器
  • Halcon Blob分析提取小光斑
  • Lua
  • 模型 总观效应
  • 【HarmonyOS NEXT】实现页面水印功能
  • selenium自动化测试之Junit