菜鸟的刷题之路之二叉树

news2024/11/27 4:31:04

💕“成功不是终点,失败不是终结,勇气才是启程的第一步。”💕
🐼作者:不能再留遗憾了🐼
🎆专栏:菜鸟的刷题之路🎆
🚗本文章主要内容:将有序数组转换为二叉搜索树、二叉搜索树中第K小的元素和叶子相似的树的详细题解🚗
在这里插入图片描述

文章目录

  • 将有序数组转换为二叉搜索树
    • 题目要求
    • 做题思路
    • 代码实现
  • 二叉搜索树中第K小的元素
    • 题目要求
    • 做题思路
    • 代码实现
  • 叶子相似的树
    • 题目要求
    • 做题思路
    • 代码实现

将有序数组转换为二叉搜索树

将有序数组转换为二叉搜索树(难度:简单)

题目要求

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。

高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。

示例 :
在这里插入图片描述

输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
在这里插入图片描述

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {

    }
}

做题思路

这个题目用到了二叉搜索树相关的知识,如果大家不了解或者忘记了,可以去看看这篇文章二叉搜索树。

二叉树是一种具有特殊性质的二叉树,它的根节点关键字总是大于左孩子的关键字,小于右孩子的关键字。并且这个题目是要求你将有序数组转换成一个高度平衡的二叉搜索树,所以我们就需要保证根节点的左右子树的高度差不超过一,那就是说我们可以每次取有序数组的最中间的值作为根节点,该中间值的左半部分作为左子树,右半部分作为右子树,然后重复进行该操作。

在这里插入图片描述

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        return sortedArrayToBSTChild(nums,0,nums.length-1);
    }

    public TreeNode sortedArrayToBSTChild(int[] nums,int left,int right) {
        if(left > right) return null;
        int mid = left + (right-left) / 2;
        TreeNode root = new TreeNode(nums[mid]);
        root.left = sortedArrayToBSTChild(nums,left,mid - 1);
        root.right = sortedArrayToBSTChild(nums,mid + 1,right);

        return root;
    }
}

在这里插入图片描述

二叉搜索树中第K小的元素

二叉搜索树中第K小的元素(难度:中等)

题目要求

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。

示例 :
在这里插入图片描述

输入:root = [5,3,6,2,4,null,null,1], k = 3
输出:31

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int kthSmallest(TreeNode root, int k) {

    }
}

做题思路

因为二叉搜索数的根节点的关键字总是大于左孩子的关键字,小于右孩子的关键字,所以我们可以先在根节点的左树中查找是否存在第 k个最小元素,如果不存在就看根节点是否是最小的第 k 个最小元素,最后在右子树中查找。在查找子树的过程中同样是左孩子 - 根节点 -右孩子的顺序查找。要想实现这种功能,我们需要借助栈这种数据结构,将从根节点到最左边的左孩子节点路径上的节点放入栈中,那么栈顶的元素总是栈中最小的数据,当左孩子不是我们要找的节点时,就看根节点,最后是右孩子。

在这里插入图片描述

以上思路就是递归的大概思路

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int kthSmallest(TreeNode root, int k) {
        Stack<TreeNode> stack = new Stack<>();
        while(root != null || !stack.empty()) {
            while(root != null) {
                stack.push(root);
                root = root.left;
            }
            root = stack.pop();
            if(--k == 0) break;
            root = root.right;
        }

        return root.val;
    }
}

在这里插入图片描述

叶子相似的树

叶子相似的树(难度:简单)

题目要求

请考虑一棵二叉树上所有的叶子,这些叶子的值按从左到右的顺序排列形成一个 叶值序列 。
在这里插入图片描述

举个例子,如上图所示,给定一棵叶值序列为 (6, 7, 4, 9, 8) 的树。

如果有两棵二叉树的叶值序列是相同,那么我们就认为它们是 叶相似 的。

如果给定的两个根结点分别为 root1 和 root2 的树是叶相似的,则返回 true;否则返回 false 。

示例 :
在这里插入图片描述

输入:root1 = [3,5,1,6,2,9,8,null,null,7,4], root2 = [3,5,1,6,7,4,2,null,null,null,null,null,null,9,8]
输出:true

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean leafSimilar(TreeNode root1, TreeNode root2) {

    }
}

做题思路

这个题目我们可以参考上面的一个题目,采用中序遍历的方法,判断该节点是否为叶子节点,如果是,就把它放入链表中。分别遍历这两个树,将叶子节点放入链表中,然后看这两个链表是否相同。

代码实现

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public boolean leafSimilar(TreeNode root1, TreeNode root2) {
        if(root1 == null || root2 == null) return false;
        List<TreeNode> list1 = new ArrayList<>();
        List<TreeNode> list2 = new ArrayList<>();
        leafSimilarChild(root1,list1);
        leafSimilarChild(root2,list2);
        if(list1.size() != list2.size()) return false;
        for(int i = 0; i < list1.size(); ++i) {
            if(list1.get(i).val != list2.get(i).val) return false;
        }

        return true;
    }

    private void leafSimilarChild(TreeNode root,List<TreeNode> list) {
        if(root == null) return;
        leafSimilarChild(root.left,list);
        if(root.left == null && root.right == null) list.add(root);
        leafSimilarChild(root.right,list);
    }
}

在这里插入图片描述

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

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

相关文章

GORM---创建

目录 模型定义使用Create创建记录一次性创建多条数据批量插入数据时开启事务默认值问题 模型定义 定义一个PersonInfo结构体。 type PersonInfo struct {Id uint64 gorm:"column:id;primary_key;NOT NULL" json:"id"UserName string gorm:"co…

路径规划算法:基于狮群优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于狮群优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于狮群优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化算法狮群…

Prometheus+Grafana(外)监控Kubernetes(K8s)集群(基于containerd)

一、实验环境 1、k8s环境 版本v1.26.5 二进制安装Kubernetes(K8s)集群(基于containerd)—从零安装教程&#xff08;带证书&#xff09; 主机名IP系统版本安装服务master0110.10.10.21rhel7.5nginx、etcd、api-server、scheduler、controller-manager、kubelet、proxymaster021…

在 Ubuntu 20.04 上安装 Nginx

保证以 sudo 用户身份登录&#xff0c;并且你不能运行 Apache 或者 其他处理进程在80端口和443端口。 安装 Nginx Nginx 在默认的 Ubuntu 源仓库中可用。想要安装它&#xff0c;运行下面的命令&#xff1a; sudo apt update sudo apt install nginx 一旦安装完成&#xff0…

Redis高级数据结构之Bitmaps

Bitmaps的介绍 现代计算机使用二进制位作为信息存储的基本单元。一个字节&#xff08;Byte&#xff09;等于8个二进制位&#xff08;bit&#xff09;。合理的使用位能有效提高内存使用率和开发效率。位是最小信息单位&#xff0c;可以表示两个状态之一。字节是更大的单位&…

虚拟机搭建

Linux(CentOS-7.6-x64位)基础配置, 虚拟机平台VmWare15 CentOS-7.6-x64镜像下载&#xff1a; https://www.aliyundrive.com/s/72Xg449t6i8 提取码: 32rm VmVare15安装包下载带序列号&#xff1a;VmVare15安装包下载带激活序列号资源-CSDN文库 点击关闭&#xff0c;点击完成&…

深入理解Jar文件:创建、使用和多版本控制

&#x1f9d1;‍&#x1f4bb;CSDN主页&#xff1a;夏志121的主页 &#x1f4cb;专栏地址&#xff1a;Java基础进阶核心技术专栏 目录 &#x1f35b; 一、创建JAR文件 &#x1f35c; 二、安装和使用清单文件 &#x1f35d; 三、创建可执行的JAR文件 &#x1f360; 四、多版…

微信小程序开发实战 ②②(全局数据共享)

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; 微信小程序 &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f4…

网络安全大厂面试题合集+

以下为网络安全各个方向涉及的面试题&#xff0c;星数越多代表问题出现的几率越大&#xff0c;祝各位都能找到满意的工作。 注&#xff1a;本套面试题&#xff0c;已整理成pdf文档&#xff0c;但内容还在持续更新中&#xff0c;因为无论如何都不可能覆盖所有的面试问题&#xf…

近年GDC服务器分享合集(三): 《Sky光·遇》实现百万在线:一种云原生的扩容方法

如今&#xff0c;游戏行业对于云原生技术的使用越来越广泛。特别是那些拥有海量玩家在线的游戏&#xff0c;使用云原生技术可以轻松做到高可用、弹性扩容和降低成本。在GDC 2022上&#xff0c;来自《Sky光遇》项目的工程师分享了相关的经验——《《Sky光遇》实现百万在线&#…

黑马Redis视频教程高级篇(一:分布式缓存)

目录 分布式缓存 一、Redis持久化 1.1、RDB持久化 1.1.1、执行时机 1.1.2、RDB原理 1.1.3、小结 1.2、OF持久化 1.2.1、AOF原理 1.2.2、OF配置 1.2.3、AOF文件重写 1.3、RDB与AOF对比 二、Redis主从 2.1、搭建主从架构 2.1.1、集群结构 2.1.2、准备实例和配置 …

基于springboot汽车站车辆运管系统java+vue

本汽车站车辆运管系统管理员可以管理个人中心&#xff0c;业务管理&#xff0c;站务管理&#xff0c;人力资源管理&#xff0c;办公司管理&#xff0c;财务管理。因而具有一定的实用性。本站是一个B/S模式系统&#xff0c;采用springboot框架&#xff0c;MYSQL数据库设计开发&a…

模型的细分和简化

​ 细分 本质为引入更多三角形 loop细分 对于新的顶点如何计算&#xff1a;下图中白点位置计算 对于旧的顶点位置计算 Catmull-Clark细分 对于非四边形的图形细分方法&#xff1a;不断将非四边形进行细分即可 下图中橙色&#xff1a;非四边形面的重心坐标&#xff1b;紫色&…

程序员必须了解的消息队列之王-Kafka

1. Kafka概述 1.1 定义 Kafka 是由 Apache 软件基金会开发的一个开源流处理平台。 Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。 1.2 消息队列 1.2.1 传统消息队列的应用场景 1.2.2 为什…

路径规划算法:基于共生生物优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于共生生物优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于共生生物优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

深度相机和彩色相机对齐(d2c)

一般商用的rgbd相机的sdk自带d2c的api&#xff0c;但是LZ还是想利用空闲时间理解下其原理。 第一步&#xff1a;标定彩色相机和深度相机。 分别采集若干张彩色摄像头和红外摄像头&#xff08;对于带有红外摄像头进行深度测量的深度摄像头&#xff0c;红外摄像头和深度摄像头其实…

mysql ssh隧道连接内网mysql

通过SSH隧道连接MySQL数据库 一.背景 问题所在&#xff1a;MySQL被运用于越来越多的业务中&#xff0c;在关键业务中对数据安全性的要求也更高&#xff0c;数据安全如果只靠MySQL应用层面显然是不够的&#xff0c;虽然说MySQL实现的登录机制基本不存在泄露密码的风险&#xf…

冈萨雷斯DIP第11章知识点

文章目录 11.3 边界特征描述子11.4 区域特征描述子11.4.3 纹理11.4.4 矩不变量 11.6 整体图像特征11.6.1 哈里斯-斯蒂芬斯 角检测器11.6.2 最大稳定极值区域 特征检测&#xff1a;在图像、区域或者边界中发现特征&#xff1b;特征描述&#xff1a;将定量属性分配给检测到的特征…

冈萨雷斯DIP第3章知识点

文章目录 3.1 背景3.2 一些基本的灰度变换函数3.2.1 图像反转3.2.2 对数变换3.2.3 幂律伽马变换3.2.4 分段线性变换函数 3.3 直方图处理3.3.1 直方图均衡化3.3.2 直方图匹配&#xff08;规定化&#xff09;3.3.3 局部直方图处理3.3.4 使用直方图统计量增强图像 3.4 空间滤波基础…

期末sql_server复习枯燥?乏味?一文带你轻松击破sql壁垒!

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集&#xff01; &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指…