当前位置:网站首页>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);
}
}
边栏推荐
- 【LeetCode】232.用栈实现队列
- 解决:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING
- Rust 入门指南 (用 WASM 开发第一个 Web 页面)
- Meishe Q&A Room | Meiying VS Meishe Cloud Editing
- 什么是 DevOps?看这一篇就够了!
- 数字知识库及考学一体化平台
- 中介者模式(Mediator)
- 【LeetCode】899.有序队列
- Digital management insight into retail and e-commerce operations - retail password
- WPF 截图控件之画笔(八)「仿微信」
猜你喜欢
【LeetCode】701.二叉搜索树中的插入操作
C语言*小白的探险历程
学会使用set和map的基本接口
美摄问答室|美映 VS 美摄云剪辑
华为开源:聚焦开源基础软件,共建健康繁荣生态
*iframe*
Use pytest hook function to realize automatic test result push enterprise WeChat
北京大学,新迎3位副校长!其中一人为中科院院士!
解决:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING
Servlet基础详细版
随机推荐
Google Earth Engine APP ——制作上传GIF动图并添加全球矢量位置
Graphical Hands-on Tutorial--ESP32 One-Key Network Configuration (Smartconfig, Airkiss)
Advanced transcriptome analysis and R data visualization hot registration (2022.10)
技术干货 | 用零信任保护代码安全
航企纠缠A350安全问题 空客主动取消飞机订单
Business collocations
【机器学习】:如何对你的数据进行分类?
C#/VB.NET:在 Word 中设置文本对齐方式
Small program containers accelerate the construction of an integrated online government service platform
单调栈一些题目练习
Redis查询缓存
mae,mse,rmse分别利用sklearn和numpy实现
昨夜梦佳人,七夕试伊妆丨基于ModelArts实现AI妆容迁移丨【玩转华为云】
Digital management insight into retail and e-commerce operations - retail password
小程序容器加快一体化在线政务服务平台建设
cubemx stm32 afm3000 module gas flow sensor driver code
C#/VB.NET:在 Word 中设置文本对齐方式
图文手把手教程--ESP32 MQTT对接EMQX本地服务器(VSCODE+ESP-IDF)
zabbix部署
shell变量