当前位置:网站首页>刷题笔记(十七)--二叉搜索树:关于属性问题
刷题笔记(十七)--二叉搜索树:关于属性问题
2022-06-21 20:28:00 【梦想成为光头强!】
目录
系列文章目录
刷题笔记(一)–数组类型:二分法
刷题笔记(二)–数组类型:双指针法
刷题笔记(三)–数组类型:滑动窗口
刷题笔记(四)–数组类型:模拟
刷题笔记(五)–链表类型:基础题目以及操作
刷题笔记(六)–哈希表:基础题目和思想
刷题笔记(七)–字符串:经典题目
刷题笔记(八)–双指针:两数之和以及延伸
刷题笔记(九)–字符串:KMP算法
刷题笔记(十)–栈和队列:基础题目
刷题笔记(十一)–栈和队列:Top-K问题
刷题笔记(十二)–复习:排序算法
刷题笔记(十三)–二叉树:前中后序遍历(复习)
刷题笔记(十四)–二叉树:层序遍历和DFS,BFS
刷题笔记(十五)–二叉树:属性相关题目
刷题笔记(十六)–二叉树:修改与构造
前言
这里就是关于二叉搜索树了,我是不是应该把红黑树提上日程了?emmmmm,应该是的,好好加油。
题录
700. 二叉搜索树中的搜索
题目链接如下:
题目截图如下:

方法一:直接遍历
这种的话就是把这个二叉搜索树当做普通的树来进行操作就行。
public class 二叉搜索树中的搜索_方法一 {
//你可以直接遍历整个树,最后得到值等于val的节点
TreeNode node;
public TreeNode searchBST(TreeNode root, int val) {
solve(root,val);
return node;
}
public void solve(TreeNode root, int val){
if(root == null) return;
if(root.val == val) node = root;
solve(root.left,val);
solve(root.right,val);
}
}
方法二:根据性质遍历_递归写法
这种的话就是根据二叉搜索树的性质进行遍查找
二叉搜索树的性质:左子树所有节点的值小于根节点,根节点的值小于右子树的所有节点值
public class 二叉搜索树中的搜索_方法二 {
//你也可以根据二叉搜索树的性质去进行搜索,递归写法
public TreeNode searchBST(TreeNode root, int val) {
return solve(root,val);
}
public TreeNode solve(TreeNode root,int val){
if(root == null) return null;
if(root.val == val) return root;
if(root.val > val) return solve(root.left,val);
return solve(root.right,val);
}
}
方法三:根据性质遍历_迭代写法
public class 二叉搜索树中的搜索_方法三 {
//你也可以根据二叉搜索树的性质去进行搜索,迭代写法
public TreeNode searchBST(TreeNode root, int val) {
if(root == null) return null;
while(root != null){
if(root.val == val){
return root;
}else if(root.val > val){
root = root.left;
}else{
root = root.right;
}
}
return null;
}
}
98. 验证二叉搜索树
题目链接如下:
题目截图如下:
这里的话可以用到二叉搜索树的另外一个性质:
二叉搜索树的中序遍历结果是一个递增数组
方法一:中序遍历数组接收
public class 验证二叉搜索树_方法一 {
//二叉搜索树的性质是什么?是不是前序遍历是一个递增的数组?所以嘛,中序遍历,然后用数组存储,这感觉不就来了?
List<Integer> list = new ArrayList<>();
public boolean isValidBST(TreeNode root){
solve(root);
if (list.size() == 1) return true;
for (int i = 1; i < list.size(); i++) {
if(list.get(i - 1) > list.get(i)){
return false;
}
}
return true;
}
public void solve(TreeNode node){
if(node == null) return;
solve(node.left);
list.add(node.val);
solve(node.right);
}
}
方法二:利用性质遍历
public class 验证二叉搜索树_方法二 {
//这种的话还是一个中序遍历,但是有一点点的不同
public boolean isValidBST(TreeNode root) {
return solve(root,Long.MIN_VALUE,Long.MAX_VALUE);
}
public boolean solve(TreeNode node,long min,long max){
if(node == null) return true;
if(node.val < min || node.val > max) return false;
return solve(node.left,min,node.val) && solve(node.right,node.val,max);
}
}
530. 二叉搜索树的最小绝对差
题目链接如下:
题目截图如下:

方法一
这种的话就是在遍历的过程中记录上一个节点的值,然后不断更新这个值。
public class 二叉搜索树的最小绝对差_方法一 {
int sum = Integer.MAX_VALUE;//用来保存最小的差值
int preVal = -100000;//用来保存前一个节点的值
public int getMinimumDifference(TreeNode root) {
solve(root);
return sum;
}
public void solve(TreeNode root){
if(root == null) return;
if(root.left != null) solve(root.left);
if(Math.abs(root.val - preVal) < sum){
sum = Math.abs(root.val - preVal);
}
preVal = root.val;
if(root.right != null) solve(root.right);
}
}
方法二
这种的话就很好理解哈,根据
public class 二叉搜索树的最小绝对差_方法二 {
public int getMinimumDifference(TreeNode root) {
List<Integer> list = new ArrayList<>();
inOrder(root,list);
int min = Integer.MAX_VALUE;
for(int i = 0;i < list.size() - 1;i++){
int key = Math.abs(list.get(i) - list.get(i + 1));
if(key < min) min = key;
}
return min;
}
public void inOrder(TreeNode node,List<Integer> list){
if(node == null) return;
inOrder(node.left,list);
list.add(node.val);
inOrder(node.right,list);
}
}
501. 二叉搜索树中的众数
题目链接如下:
题目截图如下:

看我代码标注吧
public class 二叉搜索树中的众数 {
//这道题的话我唯一的想法就是遍历二叉搜索树,然后用哈希表保存对应关系
//或者这样搞,我不用数组来维护,我用两个数字来进行维护
int maxNum;//记录当前出现最多的次数
int num;//因为中序遍历数组的众数一定是一个连续的数组,所以如果num是记录当前数字的
int count;//记录当前数字出现的次数
List<Integer> list = new ArrayList<>();//用来记录出现次数最多的数字
public int[] findMode(TreeNode root) {
inOrder(root);
int[] arr = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
arr[i] = list.get(i);
}
return arr;
}
public void inOrder(TreeNode node){
if(node == null) return;
inOrder(node.left);
solve(node);
inOrder(node.right);
}
public void solve(TreeNode node){
//首先就是要验证当前节点和记录的节点值是否相同
if(node.val != num) {
num = node.val;
count = 1;
}else {
count++;
}
//然后根据信息决定是否要更新值
if(count > maxNum){
maxNum = count;
list.clear();
list.add(node.val);
}else if(count == maxNum){
list.add(node.val);
}
}
}
总结
加快进度!!!
边栏推荐
- Chess and card games
- Luogu p5440 [XR-2] miracle solution
- 中国工程院院士郑纬民:我对中国在下一个 IT 时代拥有一席之地很乐观
- 超越同龄人,普通女生下班后如何自学自媒体视频剪辑?
- GDB调试实战(10)多线程调试
- Enzo高灵敏度检测——Arg8-Vasopressin ELISA kit
- Enzo high sensitivity detection Arg8 vasopressin ELISA Kit
- HiC-Pro | HiC数据处理工具
- Guangdong CDC reminds: the summer vacation is coming, so the returned college students can "return home" safely
- Utilisation de la combinaison d'assertions de l'API Stream et de la mise en cache locale pour les requêtes floues (près de 1000 fois plus efficace que MySQL)
猜你喜欢

I2C【2】-IIC为什么需要用开漏输出和上拉电阻bug

What is the execution order of JS asynchronism

Thresholdtypes of opencvsharp threshold segmentation threshold function

Using streamapi assertion combination and local cache for fuzzy query (nearly 1000 times more efficient than MySQL)

Ruiji housekeeper, a century old classic, is waiting for your elegant journey to start again

六个拿来就能用的有趣网页特效

自制C#编译器
![洛谷P1514 [NOIP2010 提高组] 引水入城 题解](/img/62/6bab87231074b87770e90257ef7bbc.jpg)
洛谷P1514 [NOIP2010 提高组] 引水入城 题解

【LeetCode】8、字符串转换整数(atoi)

Spark 离线开发框架设计与实现
随机推荐
Spark 离线开发框架设计与实现
文件I/O
对“XXX::Invoke”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃、损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们
技术分享 | MySQL:caching_sha2_password 快速问答
使用StreamAPI 断言组合,结合本地缓存做模糊查询(比mysql效率提升近1000倍)
利用tRNAscan-SE做tRNA分析
Go language unit test simulates service request and interface return
中国工程院院士郑纬民:我对中国在下一个 IT 时代拥有一席之地很乐观
大不列颠泰迪熊加入PUBG 手游
opencvsharp阈值分割threshold函数的ThresholdTypes
Worthington胶原蛋白酶原料
Characteristics and experimental suggestions of abbkine cell cycle Staining Kit
Pal2Nal|如何在命令行下运行Pal2Nal
Zhengweimin, academician of the Chinese Academy of Engineering: I am optimistic that China will have a place in the next it Era
精彩回顾丨一图了解华为云专场干货
广东疾控提醒:暑期将至,返粤大学生这样安全“归巢”
C# AboutBox怎么显示自己定义的界面
HiCPlotter|HiC数据可视化工具
小程序怎样关联微信小程序二维码,实现二码合一聚合
Ruiji housekeeper, a century old classic, is waiting for your elegant journey to start again