当前位置:网站首页>Leetcode刷题——二叉搜索树相关题目(98. 验证二叉搜索树、235. 二叉搜索树的最近公共祖先、1038. 从二叉搜索树到更大和树、538. 把二叉搜索树转换为累加树)
Leetcode刷题——二叉搜索树相关题目(98. 验证二叉搜索树、235. 二叉搜索树的最近公共祖先、1038. 从二叉搜索树到更大和树、538. 把二叉搜索树转换为累加树)
2022-08-04 11:06:00 【lonelyMangoo】
概念
二叉搜索树:
- 节点的左子树仅包含键 小于 节点键的节点。
- 节点的右子树仅包含键 大于 节点键的节点。
- 左右子树也必须是二叉搜索树。
而二叉搜索树的中序遍历时升序。
98. 验证二叉搜索树
题目:98. 验证二叉搜索树
思路:用中序遍历判断,当前节点是否大于之前一个。
//迭代写法
public boolean isValidBST(TreeNode root) {
Stack<TreeNode> stack = new Stack();
TreeNode cur = root;
TreeNode pre = null;
while (cur!=null || !stack.isEmpty()){
if(cur != null){
stack.add(cur);
cur = cur.left;
}
else {
cur = stack.pop();
if(pre!=null && pre.val>= cur.val){
return false;
}
//记录前一个节点
pre=cur;
cur=cur.right;
}
}
return true;
}
我一开始用的层次遍历,因为忽略了整体也要大于的情况:
也就是例子中的5、3这种情况。
当然这里也可以用递归实现,也是中序遍历并记录前一个节点
TreeNode pre=null;
public boolean isValidBST(TreeNode root) {
if(root == null ) return true;
boolean left = isValidBST(root.left);
//中序遍历操作部分
if(pre!=null && root.val <= pre.val){
return false;
}
pre = root;
boolean right =isValidBST(root.right);
return left && right;
}

我觉得递归还是比较难理解的,虽然思路是一样的但是可能不知道哪一层就出问题了,所以面试遇到还是用迭代不容易出错。
235. 二叉搜索树的最近公共祖先
题目:235. 二叉搜索树的最近公共祖先
这题只需要别人提供一个思路就能写出来:
要求的两个节点都比当前节点小,到左子树中去找
要求的两个节点都比当前节点大,到右子树中去找
如果一个比当前节点大,一个比当前节点小,就是要求的节点。
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(p.val<root.val && q.val<root.val){
return lowestCommonAncestor(root.left, p, q);
}
else if(p.val>root.val && q.val>root.val){
return lowestCommonAncestor(root.right, p, q);
}
return root;
}

538. 把二叉搜索树转换为累加树
这两道题是一样的
538. 把二叉搜索树转换为累加树
1038. 从二叉搜索树到更大和树
重新建树
第一种思路是容易想到的,先中序遍历得到所有需要的值,然后再次中序遍历给树赋值。
public TreeNode bstToGst(TreeNode root) {
List<Integer> list = new ArrayList<>();
inorder(root, list);
//将list的值设置成题目需要的
for (int i = list.size() - 2; i >= 0; i--) {
list.set(i, list.get(i) + list.get(i + 1));
}
//重新赋值
build(root, list);
return root;
}
private static void build(TreeNode root, List<Integer> list) {
int i = 0;
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
if (cur != null) {
stack.push(cur);
cur = cur.left;
} else {
cur = stack.pop();
if (cur!=null){
cur.val = list.get(i++);
}
cur = cur.right;
}
}
}
private static void inorder(TreeNode root, List<Integer> list) {
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (cur != null || !stack.isEmpty()) {
if (cur != null) {
stack.push(cur);
cur = cur.left;
} else {
cur = stack.pop();
//获得中序遍历的值
list.add(cur.val);
cur = cur.right;
}
}
}

递归
将中序遍历反过来就是由大到小,用一个sum记录累加即可。
int sum = 0;
public TreeNode bstToGst(TreeNode root) {
build(root);
return root;
}
//逆中序
private void build(TreeNode root){
if(root!=null){
build(root.right);
root.val+=sum;
sum=root.val;
build(root.left);
}
}

边栏推荐
- ECCV 2022 | 清华&腾讯AI Lab提出REALY: 重新思考3D人脸重建的评估方法
- 命令模式(Command)
- onlyoffice设置跟踪变化trackChanges默认为对自己启动
- Difference between ArrayList and LinkedList
- RAID介绍及RAID5配置实例
- C语言*小白的探险历程
- Jina 实例秀|基于神经搜索的网络安全威胁检测(一)
- apache dolphin scheduler 文件dolphinscheduler-daemon.sh详解
- Using .NET to simply implement a high-performance clone of Redis (2)
- STM32前言知识总结
猜你喜欢

热成像测温的原理是什么呢?你知道吗?

《迁移学习导论》第2版,升级内容抢先看!

美摄问答室|美映 VS 美摄云剪辑

上帝空间——全球首个基于Web3.0的艺术协议创意平台,拓宽多元艺术融合边界

Advanced transcriptome analysis and R data visualization hot registration (2022.10)

zabbix部署

命令模式(Command)

深度学习100例 —— 卷积神经网络(CNN)天气识别

What is the principle of thermal imaging temperature measurement?Do you know?

Zikko上市同时搭载HDMI2.1和2.5GbE新款雷电4扩展坞
随机推荐
解决:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING
Super Learning Method
Business collocations
AWS Lambda相关概念与实现思路
航企纠缠A350安全问题 空客主动取消飞机订单
mongo-导出数据到mysql
mysqldump远程备份数据库
Graphic and text hands-on tutorial--ESP32 MQTT docking EMQX local server (VSCODE+ESP-IDF)
关于架构的思考
图文手把手教程--ESP32 一键配网(Smartconfig、Airkiss)
helm安装
学会使用set和map的基本接口
cubemx stm32 afm3000模块 气体流量传感器 驱动代码
知其然,知其所以然,JS 对象创建与继承
ThreadLocal详细分析
[easyUI]修改datagrid表格中的值
2万字50张图玩转Flink面试体系
北京大学,新迎3位副校长!其中一人为中科院院士!
zabbix部署
知网网站地址更换