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

devtools/2024/10/19 1:29:12/

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

  • 自己看到题目的第一想法
  • 看完代码随想录之后的想法
  • 自己实现过程中遇到哪些困难
  • 总结

链接: 669. 修剪二叉搜索树
链接: 108.将有序数组转换为二叉搜索树
链接: 538.把二叉搜索树转换为累加树
链接: 总结

自己看到题目的第一想法

669.修剪二叉搜索树:递归里套递归,结束条件里应该返回再次递归的返回节点。
108.将有序数组转换为二叉搜索树:找到mid节点之后使用递归函数进行构建BST。递归函数输入参数是root节点和它的数组下标以及整个数组。结束条件根据当前下标来判断。递归处理就左右。
538.把二叉搜索树转换为累加树:题目都没怎么看懂。。

看完代码随想录之后的想法

669.修剪二叉搜索树:跟自己想的大差不差,直接秒。
108.将有序数组转换为二叉搜索树:跟自己想的递归想法有些区别,每次递归是找到中间节点和它的左右区间。
538.把二叉搜索树转换为累加树:卡哥说如果把二叉树想象成一个数组,那么就觉得蛮简单,但是由于对二叉树的遍历方式不够了解和熟悉才会觉得难。如果把搜索二叉树换成一个升序数组,那么这个问题的求解就很容易了。不同方式在于,搜索二叉树用中序遍历,在遍历过程中利用双指针来计算。

自己实现过程中遇到哪些困难

669.修剪二叉搜索树:做题时遇到两个问题,第一个是空指针异常:结束条件并没有先判断当前节点是否为空再判断节点的值大小,而是直接先判断值,就会报空指针异常;第二个问题是,判断当前节点不在范围内的时候,根据二叉搜索树的特性去有选择性的找寻它的左子树或者右子树进行判断后返回,这一步如果不细心就会判断反,中间节点如果小了就应该返回更大的右子树的递归,中间节点如果大了就应该返回更小的左子树的递归。
108.将有序数组转换为二叉搜索树: 自己写的时候遇到两个问题,第一结束条件不知道怎么完善,根据索引下标会出现遗漏,第二递归处理的时候出现栈溢出的报错。难道是递归函数中有创建新节点的参数传入的问题吗?这道题做完之后我觉得自己需要再次去回顾两道题:构造二叉树和二分法。
538.把二叉搜索树转换为累加树:看完解答之后我明白这道题不难,用我自己的话就是,右中左的遍历方式保证遍历得到的一个降序过程,用pre指针存储上一个指针的值,在中的处理步骤中得到当前节点的值与pre指针的值相加。但是我卡住的地方就是,pre怎么赋值?看完代码答案之后觉得,额,为什么我想不到呢?还出现了一个问题,这道题的pre应该声明为一个全局变量。

总结

写了8天的二叉树,现在做个总结吧!
1.树的类型:二叉树,搜索二叉树,完全二叉树,平衡二叉树,平衡搜索二叉树
2.遍历方式:前中后序遍历(递归法),层序遍历
3.递归法三部曲
4.遇到觉得很复杂的二叉树问题时,可以将二叉树看做一个数组,对数组进行如此操作的时候思路是怎样,那么转成二叉树的问题了之后其实就是再增加一个遍历方式而已。
5.遍历顺序的选择:(1)构造:前序 (2)二叉搜索树:中序 (3)普通二叉树的属性:后序


http://www.ppmy.cn/devtools/16177.html

相关文章

线程池学习

一、线程池基础 1、什么是线程池 用一句话来概述就是:线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后再需要执行新的任务时重用这些线程而不是新建线程。 2、为什么使用线程池 使用线程池最大的原因就是可以根据系统的需求和硬件环境…

如何使用rdtsc和C/C++来测量运行时间(如何使用内联汇编和获取CPU的TSC时钟频率)

本文主要是一个实验和思维扩展,是一个初步的尝试,旨在研究一些时间测量实现和在 C/C 中内联汇编和汇编函数的使用方法。除非你有特殊用途,不然不要使用汇编指令来实现这个功能。在“扩展阅读”部分会列出了一些不需要内联汇编实现的方法。 写…

个人博客系统的设计与实现

https://download.csdn.net/download/liuhaikang/89222885http://点击下载源码和论文 本 科 毕 业 设 计(论文) 题 目:个人博客系统的设计与实现 专题题目: 本 科 毕 业 设 计(论文)任 务 书 题 …

代码随想录算法训练营day9 | 28. 实现 strStr()、459.重复的子字符串

28. 实现 strStr() 暴力解法:双重循环,外层是haystack字符串,内层是needle字符串 KMP算法:当haystack字符串和needle字符串已经匹配部分之后,如果下一个不匹配后,暴力法将会从头开始匹配,已经…

树莓集团携手国际数字影像产业园代表企业与天府新区信息职业学院达成战略合作

2024年4月16日,树莓科技(成都)集团有限公司作为国际数字影像产业园的运营方及链主企业,携手园区代表企业成都奇琦汇嘉供应链科技有限公司、成都树莓友品数字技术有限公司,一同前往天府新区信息职业学院进行考察并开展产…

vue 手写手动轮播 且图片宽度不一样

vue 手写手动轮播 且图片宽度不一样 轮播图样式 <div class"case-imgs" v-if"length ! 0"><div :class"[length 1 ? big : small, imgs-wrapper]"><img class"case-img" v-for"(m, n) in activeParam.imgs"…

Java操作 elasticsearch 8.1,如何实现索引的重建?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Java面试题:解释死锁的概念,给出避免死锁的常见策略。你能给我一个具体的例子吗?

死锁&#xff08;Deadlock&#xff09;是多线程编程中的一种现象&#xff0c;指的是两个或多个线程永久性地阻塞&#xff0c;每个线程等待其他线程释放锁&#xff0c;但是这些锁又被其他线程持有&#xff0c;导致没有任何线程能够继续执行&#xff0c;从而导致程序无法前进。 死…