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

java-代码随想录第十七天| 700.二叉搜索树中的搜索、617.合并二叉树、98.验证二叉搜索树

目录

700.二叉搜索树中的搜索

617.合并二叉树

98.验证二叉搜索树


参考链接:代码随想录

二叉搜索树:

        若它的左子树不空,则左子树上所有的节点的值均小于它的根节点的值

        若它的右子树不空,则右子树上的所有的节点的值均大于它的根节点的值。

        它的左右子树也分别为二叉搜索树

700.二叉搜索树中的搜索

链接:700. 二叉搜索树中的搜索 - 力扣(LeetCode)

题目:

给定二叉搜索树(BST)的根节点 root 和一个整数值 val

你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 null 。

题解:递归法

1.确定递归函数的参数和返回值

        递归函数的参数传入的就是根节点和要搜索的数值,返回的就是以这个搜索数值所在的节点。

2.终止条件

        如果root为空,或者找到了这个数值,就返回root节点

3.确定单层递归的逻辑

        因为二叉搜索树的结点是有序的,所以可以有方向的去搜索。

        如果root.val > val,搜索左子树,如果root.val < val,就搜索右子树,最后如果都没有搜索到,就返回null

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {// 递归,利用二叉搜索树特点,优化public TreeNode searchBST(TreeNode root, int val) {if (root == null || root.val == val) {return root;}if (val < root.val) {return searchBST(root.left, val);} else {return searchBST(root.right, val);}}
}

617.合并二叉树

链接:617. 合并二叉树 - 力扣(LeetCode)

题目:

给你两棵二叉树: root1 和 root2 。

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

注意: 合并过程必须从两个树的根节点开始。

题解:递归

1.确定递归函数的参数和返回值

        要合入两个二叉树,参数至少是传入两个二叉树的根结点,返回值就是合并之后二叉树的根节点。

2.确定终止条件

        因为传入了两个树,有两个树遍历的节点t1和t2,如果t1==null,两个树合并就应该是t2了。(如果t2也为null,合并之后就是null),反之亦然。

3.确定单层递归的逻辑

        把两棵树的元素加在一起。

        t1 的左子树:合并 t1左子树 t2左子树之后的左子树。

        t1 的右子树:合并 t1右子树 t2右子树之后的右子树。

        最终t1就是合并之后的根节点。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {//3 种相加的方式if(root1==null) return root2;if(root2==null) return root1;root1.val+=root2.val;//两颗树对应位置节点值相加root1.left=mergeTrees(root1.left,root2.left);root1.right=mergeTrees(root1.right,root2.right);return root1;}
}

98.验证二叉搜索树

链接:98. 验证二叉搜索树 - 力扣(LeetCode)

题目:

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左子树只包含 严格小于 当前节点的数。
  • 节点的右子树只包含 严格大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

题解:

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

        节点的左子树只包含小于当前节点的数。

        节点的右子树只包含大于当前节点的数。

        所有左子树和右子树自身必须也是二叉搜索树。

思路:在中序遍历下,输出的二叉搜索树节点的数值是有序序列

        根据这个特性,验证二叉搜索树,判断一个序列是不是递增的。

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {TreeNode max;public boolean isValidBST(TreeNode root) {if(root == null ){return true;}boolean left=isValidBST(root.left);//验证左子树是不是有效的BST,left==false,则立即返回false,不再检查当前节点和右子树。if(!left){return false;}//中 根节点的判断if(max != null && root.val <= max.val){return false;}max=root;//检查右子树boolean right=isValidBST(root.right);return right;}
}

http://www.dtcms.com/a/350487.html

相关文章:

  • C++ STL 专家容器:关联式、哈希与适配器
  • 《微服务架构下API网关流量控制Bug复盘:从熔断失效到全链路防护》
  • 精准测试的密码:解密等价类划分,让Bug无处可逃
  • 【C语言16天强化训练】从基础入门到进阶:Day 11
  • 朴素贝叶斯算法总结
  • 互联网大厂Java面试实录:Spring Boot与微服务架构解析
  • cmd命令行删除文件夹
  • rk3566编译squashfs报错解决
  • QT5封装的日志记录函数
  • 算法练习-遍历对角线
  • 开源夜莺里如何引用标签和注解变量
  • VTK开发笔记(四):示例Cone,创建圆锥体,在Qt窗口中详解复现对应的Demo
  • 使用Cloudflare的AI Gateway代理Google AI Studio
  • 论文阅读:Code as Policies: Language Model Programs for Embodied Control
  • Redis的单线程和多线程
  • Linux_用 `ps` 按进程名过滤线程,以及用 `pkill` 按进程名安全杀进程
  • 记一次RocketMQ消息堆积
  • (二十二)深入了解AVFoundation-编辑:视频变速功能-实战在Demo中实现视频变速
  • 数字人视频创作革命!开源免费无时限InfiniteTalk ,数字人图片 + 音频一键生成无限长视频
  • ADC-工业信号采集卡-K004规格书
  • 智能电视MaxHub恢复系统
  • 【第十章】Python 文件操作深度解析:从底层逻辑到多场景实战​
  • Flink 滑动窗口实战:从 KeyedProcessFunction 到 AggregateFunction WindowFunction 的完整旅程
  • vi/vim 查找字符串
  • h5和微信小程序查看pdf文件
  • 实验1 第一个微信小程序
  • Linux学习-TCP网络协议(补充)
  • 贝叶斯方法和朴素贝叶斯算法
  • tcpdump学习
  • 20250825的学习笔记