Java C++ 算法题解leetcode669修剪二叉搜索树示例
作者:AnjaVon 发布时间:2022-09-22 04:56:13
标签:Java,C++,修剪,二叉搜索树,算法
题目要求
思路一:模拟迭代
依次判断每个节点是否合法:
左子树判断是否>low,合法就向左下走,不合法往右下;
右子树判断是否<high,合法就向右下走,不合法往左下。
首先找出结果的根,若原根小了就拉右边的过来,大了拉左边的过来做新根;
然后分别判断左右子树的大小,由于二叉搜索树的性质,子树只需要判断一边就好:
Java
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
while (root != null && (root.val < low || root.val > high)) // 确定原根是否合法
root = root.val < low ? root.right : root.left;
TreeNode res = root;
while (root != null) {
while (root.left != null && root.left.val < low)
root.left = root.left.right;
root = root.left;
}
root = res;
while (root != null) {
while (root.right != null && root.right.val > high)
root.right = root.right.left;
root = root.right;
}
return res;
}
}
时间复杂度:O(n)
空间复杂度:O(1)
C++
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
while (root != nullptr && (root->val < low || root->val > high)) // 确定原根是否合法
root = root->val < low ? root->right : root->left;
TreeNode* res = root;
while (root != nullptr) {
while (root->left != nullptr && root->left->val < low)
root->left = root->left->right;
root = root->left;
}
root = res;
while (root != nullptr) {
while (root->right != nullptr && root->right->val > high)
root->right = root->right->left;
root = root->right;
}
return res;
}
};
时间复杂度:O(n)
空间复杂度:O(1)
思路二:递归
直接用当前函数递归修剪即可:
当前值小了放右下(大)的值进去,剪掉当前和左边节点;
当前值大了放左下(小)的值进去,剪掉当前和右边节点。
然后递归掉下面所有节点。
Java
class Solution {
public TreeNode trimBST(TreeNode root, int low, int high) {
if (root == null)
return null;
if (root.val < low)
return trimBST(root.right, low, high);
else if (root.val > high)
return trimBST(root.left, low, high);
root.left = trimBST(root.left, low, high);
root.right = trimBST(root.right, low, high);
return root;
}
}
时间复杂度:O(n)
空间复杂度:O(1),忽略递归的额外空间开销
C++
class Solution {
public:
TreeNode* trimBST(TreeNode* root, int low, int high) {
if (root == nullptr)
return nullptr;
if (root->val < low)
return trimBST(root->right, low, high);
else if (root->val > high)
return trimBST(root->left, low, high);
root->left = trimBST(root->left, low, high);
root->right = trimBST(root->right, low, high);
return root;
}
};
时间复杂度:O(n)
空间复杂度:O(1),忽略递归的额外空间开销
Rust
今天又见识到了新报错:
already borrowed: BorrowMutError
,不能把borrow
的东西来回随便等,要搞临时中间变量,闭包要关好。
use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
pub fn trim_bst(root: Option<Rc<RefCell<TreeNode>>>, low: i32, high: i32) -> Option<Rc<RefCell<TreeNode>>> {
if root.is_none() {
return None;
}
if root.as_ref().unwrap().borrow().val < low {
return Solution::trim_bst(root.as_ref().unwrap().borrow().right.clone(), low, high);
}
else if root.as_ref().unwrap().borrow().val > high {
return Solution::trim_bst(root.as_ref().unwrap().borrow().left.clone(), low, high);
}
let (l, r) = (Solution::trim_bst(root.as_ref().unwrap().borrow().left.clone(), low, high), Solution::trim_bst(root.as_ref().unwrap().borrow().right.clone(), low, high)); // 要先拎出来
root.as_ref().unwrap().borrow_mut().left = l;
root.as_ref().unwrap().borrow_mut().right = r;
root
}
}
时间复杂度:O(n)
空间复杂度:O(1),忽略递归的额外空间开销
来源:https://juejin.cn/post/7141754690194112542


猜你喜欢
- launch我们经常用,今天来看看它是什么原理。建议: 食用本篇文章之前记得先食用Kotlin协程之createCoroutine和star
- 数组作为函数的参数传递首地址。A进行修改,a同时也会进行修改。数组参数的传递机制来源:https://blog.csdn.net/weixi
- 哎,最近很好久没写点东西了,由于工作的原因,接触公司自己研发的底层orm框架,偶然发现该框架在调用jdbc操作的时候参考的是hibernat
- 后台Java代码【验证码生成】/** * 随机生成6位随机验证码 */ public static String createRandomV
- 本文实例讲述了C#及WPF获取本机所有字体和颜色的方法。分享给大家供大家参考。具体如下:WPF 获取所有的字体:System.Drawing
- 本文实例讲述了Java实现求数组最长子序列算法。分享给大家供大家参考,具体如下:问题:给定一个长度为N的数组,找出一个最长的单调自增子序列(
- 本文实例为大家分享了自定义Drawable实现圆形和圆角的具体代码,供大家参考,具体内容如下圆形package com.customview
- 核心配置文件mybatis-config.xml 系统核心配置文件MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属
- 前言windows自带的游戏《扫雷》是陪伴了无数人的经典游戏,本程序参考《扫雷》的规则进行了简化,用java语言实现,采用了swing技术进
- Struts2的核心功能是action,对于开发人员来说,使用Struts2主要就是编写action,action类通常都要实现com.op
- 内容简介本篇将介绍 Flutter 中如何完成图片上传,以及上传成功后的表单提交。涉及的知识点如下:图片选择插件wechat_assets_
- 使用IDEA配置Maven搭建开发框架ssm教程一、配置Maven环境1.下载Maven:下载链接2.下载完成解压压缩包并创建本地仓库文件夹
- 1. Vscode安装Visual studio code是微软发布的一个运行于 Mac OS X、Windows和 Linux 之上的,针
- 使用JAVA工程管理越来越多的jar包,担心导错了,多导了,漏导了怎么办?换一个IDE项目后项目会不会出一堆BUG,看的头皮发麻?自己写的代
- using System;using System.Collections.Generic;namespace Demo{ &nb
- 我们知道java程序是运行在JVM中的,而JVM就是构建在内存上的虚拟机,那么内存模型JMM是做什么用的呢?我们考虑一个简单的赋值问题:in
- 首先,这两者是完全不同的概念,绝对不能混为一谈。1.什么是Java内存模型?Java内存模型是Java语言在多线程并 * 况下对于共享变量读写
- 1.用途在SpringBoot中,通过jasypt可以进行加密解密. 这个是双向的, 且可以配置密钥.2.使用:2.1通过UT创建工具类,并
- 前言在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似ke
- 网页爬虫:其实就是一个程序用于在互联网中获取符合指定规则的数据。package day05; import java.io.Buffered