代码随想录:二叉树22-24

news2025/1/15 13:01:00

目录

700.二叉搜索树的搜索

题目

代码(二叉搜索树迭代)

代码(二叉搜索树递归)

代码(普通二叉树递归)

代码(普通二叉树迭代)

98.验证二叉搜索树

题目

代码(中序递归得到中序序列)

代码(中序迭代得到中序序列)

代码(中序递归)

代码(中序迭代)

530.二叉搜索树的最小绝对差

题目

代码(中序递归得到中序序列)

代码(中序迭代得到中序序列)

代码(中序迭代)

代码(中序递归)


700.二叉搜索树的搜索

题目

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

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

示例 1:

输入:root = [4,2,7,1,3], val = 2
输出:[2,1,3]

代码(二叉搜索树迭代)

class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        while(root != null){
            //值相等,直接返回节点
            if(root.val == val){
                return root;
            }
            //target小,往左子树走
            else if(root.val > val){
                root = root.left;
            }
            //targer大,往右子树走
            else if(root.val < val){
                root = root.right;
            }
        }
        //最后root走到空,说明没找到
        return null;
    }
}

代码(二叉搜索树递归)

class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        //终止条件
        if(root == null){
            return null;
        }
        if(root.val == val){
            return root;
        }

        //单层逻辑
        if(root.val > val){
            return searchBST(root.left,val);  //目标小,往左子树走
        }
        //这里要用else,不然报错没有返回值
        else{
            return searchBST(root.right,val); //目标大,往右子树走
        }
    }
}

代码(普通二叉树递归)

class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        //终止条件
        if(root == null || root.val == val){
            return root;
        }

        //单层逻辑(前序遍历)
        TreeNode left = searchBST(root.left,val);
        TreeNode right = searchBST(root.right,val);
        if(left != null){
            return left;
        }
        else{
            return right;
        }
    }
}

代码(普通二叉树迭代)

class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        Stack<TreeNode> stack = new Stack<>();
        if(root == null){
            return null;
        }
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode cur = stack.pop();;
            if(cur.val == val){
                return cur;
            }
            if(cur.right != null){
                stack.push(cur.right);
            }
            if(cur.left != null){
                stack.push(cur.left);
            }
        }
        return null;
    }
}

98.验证二叉搜索树

题目

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

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

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

示例 1:

输入:root = [2,1,3]
输出:true

代码(中序递归得到中序序列)

class Solution {
    public boolean isValidBST(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root == null){
            return true;
        }
        inOrder(root,list); //获取中序遍历序列list
        for(int i=1;i < list.size();i++){
            if(list.get(i) <= list.get(i-1)){  //判断list是否递增
                return false;
            }
        }
        //list递增,返回true
        return true;

    }
    //中序递归二叉树,list存储中序遍历序列
    public void inOrder(TreeNode root,List<Integer> list){
        //终止条件
        if(root == null){
            return;
        }
        //单层逻辑
        inOrder(root.left,list);  //递归左子树
        list.add(root.val); //处理中间节点
        inOrder(root.right,list); //递归右子树
    }
}

代码(中序迭代得到中序序列)

class Solution {
    public boolean isValidBST(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root == null){
            return true;
        }

        //中序迭代遍历得到中序序列
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while(cur != null || !stack.isEmpty()){
            //cur非空,一直走到左子树最下
            while(cur != null){
                stack.push(cur);
                cur = cur.left;
            }
            //cur为空,最左下节点出栈
             cur = stack.pop();  
             list.add(cur.val);
             cur = cur.right;
        }

        for(int i=1;i < list.size();i++){
            if(list.get(i) <= list.get(i-1)){  //判断list是否递增
                return false;
            }
        }
        //list递增,返回true
        return true;
    }
}

代码(中序递归)

class Solution {
    //核心是pre的设计,pre代表中序序列下root的前一个节点
    //判断中间节点root时,root必须大于pre的值
    TreeNode pre = null;  //pre初始化为空,之后就一直指向root的前一个中序节点
    public boolean isValidBST(TreeNode root) {
        //终止条件
        if(root == null){
            return true;
        }

        //单层逻辑
        boolean left = isValidBST(root.left);  //判断左子树是否满足

        //判断中间节点root是否比左子树的都大,pre是左子树最大节点
        if(pre != null && root.val <= pre.val){
            return false; 
        }
        pre = root;  //更新pre,指向中间节点
        
        boolean right = isValidBST(root.right);  //判断右子树是否满足
        return left && right;  //左右子树同时满足
    }
}

代码(中序迭代)

class Solution {
    //核心是pre的设计,pre代表中序序列下root的前一个节点
    //判断中间节点root时,root必须大于pre的值
    TreeNode pre = null;  //pre初始化为空,之后就一直指向root的前一个中序节点
    public boolean isValidBST(TreeNode root) {
        //终止条件
        if(root == null){
            return true;
        }

        //中序迭代
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        TreeNode pre = null;  //增加pre,指向root的前一个节点
        while(cur != null || !stack.isEmpty()){
            //cur非空一直往左子树走
            while(cur != null){
                stack.push(cur);
                cur = cur.left;
            }
            //cur为空,最左下节点出栈
            cur = stack.pop();
            if(pre != null && pre.val >= cur.val){
                return false;
            }
            pre = cur;
            cur = cur.right;  //往右子树走
        }
        return true;
    }
}

530.二叉搜索树的最小绝对差

题目

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

差值是一个正数,其数值等于两值之差的绝对值。

示例 1:

输入:root = [4,2,6,1,3]
输出:1

代码(中序递归得到中序序列)

class Solution {
    public int getMinimumDifference(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        inOrder(root,list);
        int min = Integer.MAX_VALUE;
        for(int i=1;i < list.size();i++){
            int abs = list.get(i) - list.get(i-1);
            if(abs < min){
                min = abs;
            }
        }
        return min;
    }
    //中序递归得到中序序列list
    public void inOrder(TreeNode root,List<Integer> list){
        if(root == null){
            return;
        }
        inOrder(root.left,list);
        list.add(root.val);
        inOrder(root.right,list);
    }
}

代码(中序迭代得到中序序列)

class Solution {
    public int getMinimumDifference(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        inOrder(root,list);
        int min = Integer.MAX_VALUE;
        for(int i=1;i < list.size();i++){
            int abs = list.get(i) - list.get(i-1);
            if(abs < min){
                min = abs;
            }
        }
        return min;
    }
    //中序遍历得到中序序列list
    public void inOrder(TreeNode root,List<Integer> list){
        Stack<TreeNode> stack = new Stack<>();
        TreeNode cur = root;
        while(cur != null || !stack.isEmpty()){
            while(cur != null){
                stack.push(cur);
                cur = cur.left;
            }
            cur = stack.pop();
            list.add(cur.val);
            cur = cur.right;
        }
    }
}

代码(中序迭代)

class Solution {
    public int getMinimumDifference(TreeNode root) {
        Stack<TreeNode> stack = new Stack<>();
        TreeNode pre = null;  //代表cur的前一个中序节点
        TreeNode cur = root;
        int result = Integer.MAX_VALUE;  //初始化最大值
        while(cur != null || !stack.isEmpty()){
            while(cur != null){
                stack.push(cur);
                cur = cur.left;
            }
            cur = stack.pop();
            //更新最小值
            if(pre != null){
                int abs = cur.val - pre.val;
                if(abs < result){
                    result = abs;
                }
            }
            pre = cur;
            cur = cur.right;
        }
        return result;
    }
}

代码(中序递归)

class Solution {
    TreeNode pre = null;  //pre指向中序序列的前一个节点
    int result = Integer.MAX_VALUE;  //初始化result
    public int getMinimumDifference(TreeNode root) {
        //终止条件
        if(root == null){
            return result;
        }
        //单层逻辑
        result = getMinimumDifference(root.left);  //获取左边的最小值
        //获取中间节点的最小值
        if(pre != null){
            int abs = root.val - pre.val;
            if(abs < result){
                result = abs;
            }
        }
        pre = root;
        result = getMinimumDifference(root.right); //获取右边的最小值
        return result;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1628722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式全栈开发学习笔记---Linux基本命令2

目录 cp 源路径 目的路径 cp -r 源路径 目的路径 mv 源路径 目的路径 mv oldname newname 接下来我们继续介绍两个常用的命令 一个是拷贝文件&#xff0c;一个是剪切文件 &#xff0c;或者也可以用来改名字。 cp 源路径 目的路径 “cp”用来拷贝文件或者目录&#xff0c;…

Swagger3.0(Springdoc)日常使用记录

文章目录 前言一、默认地址二、注解OperationTag 三、SpringBoot基础配置四、Swagger导入apifox五、Swagger其他配置六 knife4j 参考文章 前言 本文并不是Swagger的使用教程&#xff0c;只是记录一下本人的操作&#xff0c;感兴趣的可以看下 一、默认地址 http://localhost:…

38-数组 _ 一维数组

38-1 数组的创建 数组是一组相同类型元素的集合。 数组的创建方式&#xff1a; type_t arr_name [const_n]; //type_t 是指数组的元素类型 //const_n是一个常量表达式&#xff0c;用来指定数组的大小 举例&#xff1a; int arr[10]; char ch[5]; double data[20]; 问&…

Vue基础:为什么要学Vue3,Vue3相较于Vue2有那些优势?

为什么要学Vue3&#xff1f; 1.框架层面 1.响应式底层API的变化 Proxy 数组下标的修改 对象动态添加属性 解释说明&#xff1a;1.vue2采用的是Object.definePrototype&#xff0c;它每次只能对单个对象中的单个数据进行劫持&#xff0c;所以在Vue2中data()中的数据一多就要进行…

香港BTC、ETH现货ETF同时通过,对行业意义几何?

香港比美国更快一步通过以太坊现货 ETF。 2024 年 4 月 15 日&#xff0c;香港嘉实国际资产管理有限公司&#xff08;Harvest Global Investments&#xff09;今天宣布&#xff0c;得到香港证监会的原则上批准&#xff0c;将推出两大数字资产&#xff08;比特币及以太坊&#…

计算公式基础

文章目录 MASMAEXMPA加权移动平均线成交量换手率MACDKDJ MA 均线一般指移动平均线。 移动平均线&#xff0c;Moving Average&#xff0c;简称MA&#xff0c;MA是用统计分析的方法&#xff0c;将一定时期内的证券价格&#xff08;指数&#xff09;加以平均&#xff0c;并把不同…

RabbitMQ工作模式(5) - 主题模式

概念 主题模式&#xff08;Topic Exchange&#xff09;是 RabbitMQ 中一种灵活且强大的消息传递模式&#xff0c;它允许生产者根据消息的特定属性将消息发送到一个交换机&#xff0c;并且消费者可以根据自己的需求来接收感兴趣的消息。主题交换机根据消息的路由键和绑定队列的路…

梦境绘师:揭秘生成对抗网络(GAN)的魔法

梦境绘师&#xff1a;揭秘生成对抗网络&#xff08;GAN&#xff09;的魔法 1 引言 在今日的深度学习领域&#xff0c;生成对抗网络&#xff08;GAN&#xff09;已成为一项无人能外的技术&#xff0c;以其独特的数据生成能力俘获了无数研究者和工程师的心。这项技术不仅在理论上…

Golang基础2-Array、Slice、Map

Array 数组 var a [5]int b:[5]int{} c:[...]int{}这样格式定义var a[5]int 和var a[10]int是不同类型从0开始下标&#xff0c;到len(a)-1遍历方式&#xff1a; for i : 0; i < len(a); i { }for index, v : range a { } 注意越界问题&#xff0c;panic值类型&#xff0c;…

知识图谱嵌入领域的重要研究:编辑基于语言模型的知识图谱嵌入

今天&#xff0c;向大家介绍一篇在知识图谱嵌入领域具有重要意义的研究论文——Editing Language Model-based Knowledge Graph Embeddings。这项工作由浙江大学和腾讯公司的研究人员联合完成&#xff0c;为我们在动态更新知识图谱嵌入方面提供了新的视角和方法。 研究背景 在…

go设计模式之工厂方法模式

工厂方法模式 什么是工厂方法模式 工厂方法模式是一种创建型设计模式&#xff0c;它定义了一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化推迟到其子类。 这个接口就是工厂接口&#xff0c;子类就是具体工厂类&#xff0c;而需要创…

盛水最多的容器 ---- 双指针

题目链接 题目: 分析: 最大容积 即使就是最大面积, 长为下标之差, 宽为两下标对应值的最小值解法一: 暴力枚举: 将每两个数之间的面积都求出来, 找最大值, 时间复杂度较高解法二: 假设我们的数组是[6, 2, 5, 4], 我们先假设最左边和最右边, 即6 和 4 之间是最大面积长a*宽b此…

便携式应急指挥箱规格参数

概况: 微缩型的无线视频音频传输的机动挥所。体积小、重量轻、公配电方便、携带便携、功能齐全。可进行单兵作战&#xff0c;通过此无线音频视频传输的指挥箱能完成现场图像、语音、数据的采集等功能&#xff0c;可以通过5G/4G/WIFI等多种无线网络完成传输的需求&#xff0c;或…

和鲸科技出席第五届空间数据智能学术会议,执行总裁殷自强受邀发表主题报告

4月26日&#xff0c;由 ACM SIGSPATIAL 中国分会、ACM SIGMOD 中国分会主办的第五届空间数据智能学术会议&#xff08;SpatialDI 2024&#xff0c;下简称“会议”&#xff09;在南京盛大开幕。本次会议特邀李清泉院士、周成虎院士、丛高教授、谢炯博士、张雪英教授等国内外知名…

流量网关与服务网关的区别:(面试题,掌握)

流量网关&#xff1a;&#xff08;如Nignx&#xff0c;OpenResty&#xff0c;Kong&#xff09;是指提供全局性的、与后端业务应用无关的策略&#xff0c;例如 HTTPS证书认证、Web防火墙、全局流量监控&#xff0c;黑白名单等。 服务网关&#xff1a;&#xff08;如Spring Clou…

通义灵码-IDEA的使用教程

通义灵码-IDEA的使用教程 1、通义灵码是什么&#xff1f; 通义灵码&#xff0c;是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力&#…

受尽折磨的ai剪辑视频心酸之路

因为公司需要剪辑好多视频~我每天不断手动剪啊剪啊手都剪麻 有天老板跟我说了句人家好多ai剪辑你能不能搞到一个&#xff0c;多少钱你在说。 我心想这不是我的强项么&#xff1f;白嫖界的天花板&#xff0c;我就拦下了这个活~于是我上班不是在找软件就是在逛论坛路上&#xff0…

【漏洞复现】润乾报表InputServlet13文件读取漏洞

漏洞描述&#xff1a; 润乾报表是一款功能全面且性能卓越的报表产品。它专注于企业级BI产品的研发和推广&#xff0c;通过提供丰富的报表功能和高效的开发工具&#xff0c;帮助用户提升图表的开发效率&#xff0c;节省成本。 润乾报表InputServlet13接口存在文件读取漏洞&…

数据结构 - 链表详解一 - 链表的介绍

一. 为什么要学习链表 我们已经学习了顺序表了&#xff0c;在学习的时候发现顺序表的功能很多&#xff0c;所以我们为什么还要学习链表呢&#xff0c;学习链表有什么用吗&#xff1f; 下面我将通过几个方面去研究一下 1. 动态数据操作 顺序表&#xff08;如数组&#xff09;通…

回溯-单词搜索

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或垂直相…