BST

[BST的构建][C++实现] 今天前面碰到一题,判定给定的BST是否是合法的,因为BST性质,LDR遍历递增,根据这个来判定即可。但是碰到给定自行构建BST的时候,给定的输入是这样的: 5 1 5 2 3 1 0 0 3 4 5 4 0 0 6 0 0 什么意思呢,第一行为n和root,分别代表总共n个节点,并且root节点为序号root的节点。 之后每一行输入的是三个数,分别为val,left_idx,... 阅读详情

Closest Binary Search Tree Value

所谓 “最近的点”,可能是 parent ,可能是 child,可能在左边,也可能在右边。
  • 所以一要存好 prev;
  • 二要两边都探,不能沿着一边硬走。

  • 为什么写成两个函数?因为这里是preorder traversal!

使用二叉树的preoder traversal,不断update closet value

public class Solution {
    double dif=Double.MAX_VALUE;
    int nodeval=0;
    
    public int closestValue(TreeNode root, double target) {
        helper(root,target);
        return nodeval;
    }
    
    private void helper(TreeNode root,double target){
        if(root==null) return;
        
        if(target==root.val){
            nodeval=root.val;
            return;
        }
        
        if(Math.abs(target-root.val)<dif){
            dif=Math.abs(target-root.val);
            nodeval=root.val;
        }
        helper(root.left,target);
        helper(root.right,target);
    }
}

方法二:利用BST的性质+BST遍历模板(从root开始),不断update closet value。root<target就往左走,否则就往右走。

Validate Binary Search Tree

利用 Integer 是 object 的性质,用 null reference 代表开区间。从root开始遍历。
public class Solution {
    public boolean isValidBST(TreeNode root) {
        return isValidBST(root, null, null);
    }
    
    private boolean isValidBST(TreeNode root, Integer max, Integer min){
        if (root == null){
            return true;
        }
        // 如果该节点大于上限 返回假
        if (max != null && root.val >= max){                      //root.val是左子树的max 右侧的max是root的值,max应该比左边要大才对
            return false;
        }
        // 如果该节点小于下限 返回假
        if (min != null && root.val <= min){                       //root.val是右子树的value 右侧的min是root的值,min应该比左边要小才对(min比右子树最小的还要小)
            return false;
        }
        // 递归判断左子树和右子树
        return isValidBST(root.left, root.val, min) && isValidBST(root.right, max, root.val);
    }
}

同样的,这题用 in-order traversal 也可以做,也不需要设全局变量。根据inorder性质,从left most开始遍历。后一个number起码不小于前一个number。

public boolean isValidBST(TreeNode root) {
   if (root == null) return true;
   Stack<TreeNode> stack = new Stack<>();
   TreeNode pre = null;
   while (root != null || !stack.isEmpty()) {
      while (root != null) {
         stack.push(root);
         root = root.left;
      }
      root = stack.pop();
      if(pre != null && root.val <= pre.val) return false;
      pre = root;
      root = root.right;
   }
   return true;
}

Kth Smallest Element in a BST

这题考察的就是 BST 的性质: in order = sorted.

另一种应对多次查询的好办法是 augmented binary tree; 第一次用 O(n) 的时间统计记录一下每个 node 左子树节点个数,后面的每次查询就可以 O(height) 的时间搜索了。
public class Solution {
    public int kthSmallest(TreeNode root, int k) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode cur = root;

        while(cur != null || !stack.isEmpty()){
            while(cur != null){
                stack.push(cur);
                cur = cur.left;
            }

            TreeNode node = stack.pop();
            if(--k == 0) return node.val;
            cur = node.right;
        }

        return root.val;
    }
}

Inorder Successor in BST

简单写法是 naive 的in order traversal. 只要是 binary tree 都可以用。

public class Solution {
    public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode cur = root;
        boolean reachedP = false;

        while(cur != null || !stack.isEmpty()){
            while(cur != null){
                stack.push(cur);
                cur = cur.left;
            }
            TreeNode node = stack.pop();
            if(reachedP) return node;
            if(node == p) reachedP = true;

            cur = node.right;
        }
        return null;
    }
}
  • 不过这题还可以进一步利用 BST 的性质,用模板从root开始遍历,每一次把比p.val稍大的那个root.val给记录下来。

public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
    TreeNode res = null;
    while(root!=null) {
        if(root.val > p.val) {
            res = root;
            root = root.left;
        }
        else root = root.right;
    }
    return res;
}

Convert Sorted Array to Binary Search Tree

利用 BST inorder = sorted 的性质,一道很有意思的递归题。

在 BST 里多用区间的思想思考问题。

public class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return helper(nums, 0, nums.length - 1);
    }

    private TreeNode helper(int[] nums, int start, int end){
        if(start > end) return null;
        if(start == end) return new TreeNode(nums[start]);

        int mid = start + (end - start) / 2;

        TreeNode root = new TreeNode(nums[mid]);
        root.left = helper(nums, start, mid - 1);
        root.right = helper(nums, mid + 1, end);

        return root;
    }








算法——BST BST是二叉搜索树(Binary Search Tree)的缩写,它是一种特殊的二叉树结构,其中每个节点的左子树中的所有节点都小于该节点的值,而右子树中的所有节点都大于该节点的值。这使得在BST中可以高效地进行搜索、插入和删除操作。左子树中的所有节点都小于根节点。右子树中的所有节点都大于根节点。左右子树也是二叉搜索树。祝您好运! 阅读详情

相关推荐

bst:基于二叉搜索树(BST)的映射和集合类型

二进制搜索树(BST) 该库基于二进制搜索树实现映射类型BSTMap和集合类型BSTSet 。 该API的用途与HashMap / HashSet和BTreeMap / BTreeSet等类型相似,同时还提供了使用较低级别的root和root_mut方法实现自己的遍历的功能。 这些数据结构不是由每个节点执行分配,而是由竞技场分配器支持,竞技场分配器仅偶尔分配以增加其容量。 竞技场以块为单位分配内存,而不会使之前产生的任何地址无效。 这对于插入性能非常有用,因为我们每次需要更多空间时都不必复制和更新所有先前分配的节点。 您正在操作的节点也很有可能连续放置在内存中,这非常适合缓存局部性。 root和root_mut方法返回的类型提供了left和right方法,以便在树中方便且直观地遍历。 几乎感觉就像您希望用垃圾回收语言编写的树API,但没有额外的开销,并且具有Rust借用检查器的所有常

[模板总结] - 二叉搜索树 BST - 基础篇

模板题目链接 BST查找 -Leetcode 270. Closest BST Value BST插入 -Leetcode 701. Insert Node in BST BST删除 -Leetcode 450. Delete Node in BST 二叉搜索树-BST 概述 BST是二叉树的一种,具备二叉树的结构性质:只有一个Root节点,每一个节点最多可以有左右两个子节点。BST自身的性质:每一个节点的左儿子数值一定比他小,右儿子的数值一定比他大。这个性质也使得BST的中序遍历输出结果是一...

ok1382038的博客 484

人工智能训练师技能等级认定四级技能考核试卷-样题1

本文为人工智能训练师四级技能考核试卷,包含六个实操考核项目,总分100分,考试时间150分钟。试卷涵盖数据处理、模型训练准备及系统维护等核心技能:1)垃圾分类数据集规范与处理(30分),要求评估数据格式并编写Python处理代码;2)学生成绩数据集分析(20分),涉及数据预处理、可视化及相关性分析;3)数据标注审核(10分),重点审核标注准确性;4)智能数据服务系统维护与优化(40分),包括安全帽数据集的项目创建、数据处理及平台协作。考核强调Python编程、数据处理平台操作及AI工作流程的实践能力。

weixin_42221934的博客 440

JAVA数据结构之BSTMap

BSTMap 由BST底层实现的映射 接口 public interface Map&lt;K,V&gt; { void add(K key, V value); V remove(K key); boolean contains(K key); V get(K key); void set(K key,V newValue); i...

weixin_41263632的博客 746

保姆级教程:用GlobleLand30数据+GTB3.3软件,一步步搞定MSPA景观格局分析

本文提供GlobleLand30数据结合GTB3.3软件进行MSPA景观格局分析的保姆级教程,涵盖数据预处理、软件操作、结果解读全流程,特别针对零基础用户常见问题提供解决方案,助力研究者高效完成景观生态学分析。

weixin_26757925的博客 450

控制障碍函数(Control Barrier Function,CBF) 二、示例

使用一个经典简单的示例讲解CBF的推导

Lyajpunov的博客 6434

C++ 二叉搜索树(BST)详解

二叉搜索树(Binary Search Tree,简称 BST)是编程中最常用的树形数据结构之一,核心特点是左子树所有节点值 < 根节点值 < 右子树所有节点值,基于这个特性可以实现高效的查找、插入、删除操作(平均时间复杂度 O(logn))。可以把二叉搜索树想象成一个 “有序的家谱”:下面是包含插入、查找、删除、中序遍历(验证有序性)的完整可运行代码,注释详细,适合直接复制学习:cpp运行 三、关键功能解释 1. 插入逻辑 递归遍历树,找到 “空位置”(nullptr)就新建节点; 遵循 “

2501_94473255的博客 207

Android布局基础与UI设计入门:打造精美应用界面

恭喜你!现在你已经掌握了Android UI开发的基础知识,包括各种布局类型、常用控件的使用以及一些UI优化技巧。这些知识将帮助你设计出既美观又实用的Android应用界面。

m0_65382359的博客 2058

二叉搜索树(BST,Binary Search Tree)

为何学?1.二叉搜索树是一种树形结构,是一种查找效率非常高的结构,值得我们去学习2.map和set的底层也是二叉搜素树,学习二叉搜索树可以让我们更好的了解set和map的特性。

liuty0125的博客 2011

深入解析 Multi-Agent 协同决策机制与架构设计

让我们从一些基础定义开始,为后续的讨论建立共同的语言。在计算机科学和人工智能领域,智能体(Agent)是指一个能够感知环境、做出决策并执行动作的实体。智能体是任何可以通过传感器感知环境,并通过执行器作用于该环境的事物。atπstat​πst​sts_tst​是时刻ttt的环境状态(或智能体的观测)π\piπ是智能体的策略(Policy),即从状态到动作的映射ata_tat​是智能体在时刻ttt选择执行的动作多智能体系统(MAS)

AI天才研究院 542

IGCT 测试原理概述

IGCT(Integrated Gate-Commutated Thyristor,集成门极换流晶闸管)是一种高功率半导体器件,基于门极可关断晶闸管(GTO)的原理,但通过集成门极驱动单元和优化结构(如硬驱动技术),实现了更低的导通损耗、更快的开关速度和更高的可靠性。它适用于中高压大功率应用,如高压直流输电(HVDC)、中压变频器和模块化多电平变换器(MMC)。IGCT 的结构为四层 p-n-p-n 器件,门极电流控制导通和关断,阳极电流在关断时快速换流至门极,通常在 1 μs 内完成。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 238

二叉搜索树(BST)详解:从原理到实现

二叉搜索树是一种基于二叉树结构的高效数据组织方式,它通过特定的排序规则将数据元素组织在树形结构中,从而支持快速的查找、插入和删除操作。核心特性:有序性:树中每个节点都满足"左小右大"的排序关系递归结构:每个子树本身也是一棵二叉搜索树灵活性:支持动态调整,适应数据的变化左子树约束:若左子树非空,则左子树所有节点的值 ≤ 根节点的值右子树约束:若右子树非空,则右子树所有节点的值 ≥ 根节点的值递归约束:左、右子树本身也是二叉搜索树教学价值:理解树形结构的基础算法思想:体现"分而治之"和"递归"思想性能平衡。

qq_67169366的博客 627

标准测试测试数据STDF学习笔记

本文介绍了STDF(Standard Test Data Format)文件的结构与解析方法。首先详细说明了STDF记录的组成,包括记录头类型(REC_TYP和REC_SUB)、数据类型定义、时间日期格式以及无效数据标识。重点分析了25种主要记录类型的功能、数据内容和出现位置,如FAR、MIR、MRR等关键记录。然后介绍了基于pystdf开源工具的解析方法,包括自带脚本的使用和自编程解析流程,通过事件驱动机制处理数据流。特别指出测试数据是按照PIR→PTR/MPR/FTR→PRR的循环模式组织。文章为ATE

歌颂苦难的行为是无耻的; 1513

BST树

目录一、BST树二、查找操作递归实现非递归实现三、插入操作递归实现非递归实现四、删除操作递归实现非递归实现 一、BST树 二叉查找树(Binary Search Tree),又名二叉搜索树或二叉排序树。可以是一颗空树,或者是具有下列性质的二叉树: (1)若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值。 定义BST...

sspudding 2565

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

BST(二叉搜索树)

BST(二叉搜索树) 所谓二叉搜索树(Binary Search Tree,简称 BST)大家应该都不陌生,它是一种特殊的二叉树。 特殊在哪里呢? 简单来说就是:左小右大。 BST的完整定义如下: BST 中任意一个节点的左子树所有节点的值都小于该节点的值,右子树所有节点的值都大于该节点的值。 BST 中任意一个节点的左右子树都是 BST。 有了BST的这种特性,就可以在二叉树中做类似二分搜索的操作,搜索一个元素的效率很高。 一个合法二叉树的举例 对于 BST 相关的问题,你可能会经常看到类似下面

毕业才是起点 7293

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

BST与AVL

树形结构的实际应用 介绍两种树形结构的实际应用,BST和AVL可能相对比较重要,单独放在这里,其实哈夫曼树,堆排序都算树形结构的实际应用 1.BST二叉排序树(左小右大的树) 1.1二叉排序树需求 需求分析: 给你一个数列 { 7, 3, 10, 12, 5, 1, 9 } ,要求能够高效的完成对数据的查询和添加。 解决方案: 1.使用数组 1).数组未排序, 优点:直接在数组尾添加,速度快。 缺点:查找速度慢 2).数组排序,优点:可以使用二分查找,查找速度快,缺点:为了保证数组有序,在添加新数据时,找到

weixin_42178281的博客 1370

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

我要种一棵BST(二叉排序树)

BST(二叉排序树) 从BST的概述,BST的创建思想,BST的代码实现与分析,BST的图解展开阐述 若有疏漏,欢迎指出 博主空间https://blog.youkuaiyun.com/JOElib?type=blogAVL树https://joelib.blog.youkuaiyun.com/article/details/124072495?spm=1001.2014.3001.5502多叉树和图https://joelib.blog.youkuaiyun.com/article/details/124042140?spm=...

算法萌新一枚 927

删除BST的节点

BST是什么? 二叉搜索树BST(Binary Search Tree),又称为二叉排序树。 该树要么是一个空树,要么具有以下性质: 序号 BST的性质 1 左树不空,则左树中所有节点中的值都小于根节点的值 2 右树不空,则右树中所有节点中的值都大于根节点的值 3 左右子树也是BST 下图中的树便是一棵BST: BST的节点插入 创建二叉搜索树比较简单,首先我们定义出二叉搜索树的节点类模板BSTNode,该类应具有三个成员,分别是左孩子指针leftchild,右孩子指针righ

qq_39208237的博客 2255

树相关算法之二叉搜索树(BST):BST的验证和搜索、BST的修改操作、BST的构造

本文介绍了二叉搜索树(BST)的基本概念和常见操作。BST具有左子树节点值小于根节点、右子树节点值大于根节点的特性,其中序遍历结果为升序序列。文章重点讲解了BST的验证、搜索和修改操作,包括验证二叉搜索树的有效性(LeetCode 98)、在BST中搜索指定节点(LeetCode 700)、查找第K小的元素(LeetCode 230)、插入新节点(LeetCode 701)以及删除指定节点(LeetCode 450)等问题。

专注人工智能应用领域 1046

BST删除操作

BST的删除操作向来被认为难度很大,因为它不同于插入,定位到了那个该插入的位置选择左边/右边进行插入即可,而删除操作则需要分成以下三种情况进行讨论,删除难度从上到下依次递增: case1 叶子结点 case2 只有左子树/只有右子树的结点 case3 左子树和右子树都存在的结点 其实case1,case2的难度系数都不大,重难点就是在于处理case3这种情况的结点 case1 叶子结点直接将...

CodeChicken的博客 3640

BST Mock

【代码】BST Mock。

weixin_65279006的博客 1156

【Java数据结构】BST树(二叉搜索树)总结03(求BST树高度,求BST树节点个数)

二叉树总结:入口 二叉树的基本操作: 1、插入,删除 操作 2、前、中、后序遍历,层序遍历 3、求BST树高度,求BST树节点个数 4、返回中序遍历第k个节点的值 5、判断一个二叉树是否是BST树,判断一个BST树是否是AVl树 6、BST树的镜像 7、把BST树满足[begin,end]区间的值放在集合中、打印出来 8、判断是否是子树 9、按层打印二叉树 1、求BST...

懂技术的猫 2223

BST二叉搜索树

然后我们比较要插入的值和当前节点的值,如果要插入的值小于当前节点的值,则将其插入到左子树中;遍历顺序为“左-根-右”。先递归遍历左子树,然后访问根节点,最后递归遍历右子树。对于二叉搜索树来说,中序遍历会得到一个按节点值升序排列的序列,这是BST特有的性质,常用于BST的排序输出或验证BST的性质。这是因为BST的性质保证了左子树的所有节点值小于根节点值,而右子树的所有节点值大于根节点值。在二叉树中删除一个节点是一个相对复杂的过程,尤其是当涉及到二叉搜索树(BST)时,因为删除操作需要维护树的性质。

超级博客 1202

二叉搜索树(BST)

目录 一,二叉搜索树(二叉查找树,二叉排序树) 二,OJ实战 力扣98. 验证二叉搜索树 力扣 96. 不同的二叉搜索树 力扣 95. 不同的二叉搜索树 II 一,二叉搜索树(二叉查找树,二叉排序树) 二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 二,OJ实战 力扣98. 验证二叉搜索树 题目: 给定一个二叉树,判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树...

nameofcsdn的博客 4471

BST+二分

第一个等于【1,4,4】等于的时候也要缩小r,如果r恰好在等于前一个位置时说明找到了,此时l==r然后运行一次,把l值+1即可int l = 0;//闭区间:[l,...,r]//等于时候也要缩小r才能找到第一个等于}else{//l值对应正确的结果return l;最后一个等于思路类似,只是要不断扩大l,使得l指向第一个大于目标值的位置int l = 0;

laugh哥的博客 1079
上一篇: Tree, Min/Max/Balanced Depth
下一篇: 快速排序
michaelbinwang
博客等级 码龄10年 1粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值