LeetCode-109.有序链表转换二叉搜树

2023-11-09

在这里插入图片描述

二叉搜索树

二叉查找树又称二叉搜索树或者二叉排序树;它可以是一个空树或者是一个二叉树,既有链表的快速插入与删除的特点,又有数组快速查找的优势。具有以下性质:
①.若左子树非空,则左子树所有节点均小于根节点的值;
②.若右子树非空,则右子树所有节点均大于根节点的值;
③.左右子树也是二叉查找树;
④.没有键值相等的节点。

快慢指针

快慢指针是两个指针同向移动,某一时刻来看两个指针一个在前,一个在后,即快指针和慢指针。造成两个指针一前一后的原因有两种情况:
①.两个指针速度相同,但是出发时间不同,也可以认为是出发起始位置不同,在两个指针都出发后会以固定的距离间隔一前一后的向前移动;
②.两个指针速度不同,但是从同一个起点同时出发,之后会以固定的速度差一前一后的向前移动,两个指针的距离间隔随时间规律的递增;

题目分析

①.原链表是有序的,要使转换成的二叉树高度平衡,只需要寻找中间节点作为跟节点即可,然后作用两侧分别转换成左子树和右子树。
②.查找中间节点可以使用快慢指针进行查找。
③.通过递归算法即可完成二叉搜索树的转换。

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* sortedListToBST(ListNode* head) {

        return sortedListToBST(head,nullptr);

    }
    // [head,tail) 左闭右开范围
    TreeNode* sortedListToBST(ListNode* head,ListNode *tail)
    {
        //遍历到了尾节点,直接返回
        if( head == tail ) return nullptr;
        //查找当前范围的中间节点作为根节点
        ListNode *mid = midNode(head,tail);
        if( mid == nullptr ) return nullptr;

        TreeNode * root = new TreeNode();
        root->val = mid->val;
        //当前范围只剩一个节点,终止递归
        if( head == mid ) return root;
        //递归得到左右子节点
        root->left = sortedListToBST(head,mid);
        root->right = sortedListToBST(mid->next,tail);

        return root;
    }
    //双指针查找链表中间节点
    ListNode* midNode(ListNode* head,ListNode * tail)
    {
        ListNode * fast = head, *slow = head;
        while(fast != tail && fast->next != tail)
        {
            slow = slow->next;
            fast = fast->next;
            fast = fast->next;
        }
        return slow;
    }

};

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode-109.有序链表转换二叉搜树 的相关文章

  • MySQL 表连接 JOIN

    参考 表连接 前言 建表语句 测试数据 一 表连接JOIN基础 1 什么是表连接 什么是JOIN 2 表连接的分类 2 1 内连接 2 2 外连接 2 3 等值连接 2 4 自然连接 前言 建表语句 表a CREATE TABLE a ta
  • C++迭代器作为参数传递进函数使用时的注意事项

    外部函数对迭代器进行值传递而非引用 需要注意的一点是在使用迭代器作为传入参数进行迭代器运算操作的时候 作用对象仅仅是对传入迭代器的拷贝 因为在传入迭代器后函数直接对传入的对象进行拷贝操作而不访问源对象的内存空间https blog csdn
  • html 线条外阴影,怎么添加阴影边框?

    本文介绍使用CSS添加阴影边框和word文档中添加阴影边框的方法 有一定的参考价值 有需要的朋友可以参考一下 希望对大家有所帮助 CSS添加阴影边框的方法 方法1 使用box shadow属性添加阴影边框 相关推荐 css在线手册 box
  • 程序员最全的Linux命令,不全来找我随时更新!

    一 引言 1 1 Linux引言 Linux是一套免费使用和自由传播的类Unix操作系统 是一个基于POSIX和Unix的多用户 多任务 支持多线程和多CPU的操作系统 伴随着互联网的发展 Linux得到了来自全世界软件爱好者 组织 公司的

随机推荐

  • 常见传感器和芯片的介绍

    文章目录 一 传感器 1 1 KY xxxx系列 KY 002 KY 003 KY 004 KY 005 KY 006 KY 007 KY 008 KY 009 KY 010 KY 011 KY 012 KY 013 KY 014 KY 0
  • 虚拟服务器ftp上传权限设置,13. 为 FTP虚拟用户设置“不同文件目录”和“访问权限”...

    Re FTP 文件传输服务 FTP 服务不论在企业或教学中 是很常用的文件共享方式 它既可以做到匿名访问 也可以做到用户名和密码访问 更可以做到只能提交但不能够访问的特殊要求等等功能 本课程将一一详细演示 FTP 服务器的一般应用场景在 企
  • check allInputDimensionsSpecified() for second profile fail

    目录 yolov7 tensorrt预测时报错 在python代码里 在调用engine推理前做这样的设置即可 yolov7修改后的tenorr
  • Java JUC概述

    Java JUC Java Util Concurrent 是 Java 平台提供的并发编程工具包 它提供了一系列的工具类和接口 用于简化多线程编程 JUC 中的类和接口都是基于 Java 平台的底层并发原语 如锁 信号量 原子变量等 实现
  • 机器视觉及其应用发展

    导读 一 机器视觉的研究和发展动态 机器视觉的研究 发展和应用还远没有达到成熟的程度 机器视觉从诞生到今天才只有短短的三十多年时间 在机器视觉中承担 大脑 作用的图像分析处理 图像理解和模式识别理论和技术基础还非常不完善 甚至 机器视觉的图
  • TextMeshPro 使用及性能

    目录 TextMeshPro 组件介绍 Main Setting Extra Setting 轮廓 阴影 外发光 表情混编使用 表情资源制作 中文字体制作 关于性能 TextMeshPro ps 第一次写博客 排版和表述可能有不尽人意的地方
  • 精选36道SQL练习题解析 from(原50道SQL练习题)

    SQL练习题 友情链接 1 医疗信息管理系统数据库 MySQL 2 邮件管理数据库设计 MySQL 3 SQL Server医疗信息管理系统数据库 英文版 源码 Medical Management System Database 4 SQ
  • 安装Homebrew——各种报错解决(2020-5-4亲测)

    国内安装Homebrew 2020 5 4亲测 今天安装Homebrew时 挂了VPN报错 curl 7 Failed to connect to raw githubusercontent com port 443 Connection
  • Springboot整合redis+jedis

    Spring Boot整合Redis Jedis 1 在pom xml添加Redis依赖Jedis依赖和 示例代码如下
  • YOLOv8不修改源码训练自己数据集最简单做法

    首先 这篇文章是针对不修改源码 只是单纯希望运行YOLOv8对自己数据集进行测试 完成论文部分对比实验部分结果的朋友们 如果需要修改源码仍是需要按照一步步安装源码安装环境进行操作的 由于本人实验时是租借云服务器的 捣鼓好久仍然没有完全安装下
  • Qt 在发送一次信号触发两次槽函数的解决方法

    connect EnterPushButton SIGNAL clicked this SLOT on CreateProject clicked 备注 1 EnterPushButton 是确定按钮 2 一定要写SIGNAL Clicke
  • Unity基础框架从0到1 开篇

    接下来我打算跟大家分享一期关于Unity游戏基础框架的一些内容 希望可以给一些游戏开发初学者提供一点思路 同时也希望借这个机会和大家探讨并继续完善这个框架 框架经过实践的检验才能更加健壮 知识的积累一方面在于自身的学习 一方面在于分享和探讨
  • 该如何在视频里添加文字呢?推荐3个视频加文字的方法

    字幕是一个视频或电影中相当重要的一部分 方便我们更加容易看懂视频所要表达的意思 我们在日常生活中拍摄视频也想添加字幕 那我们该如何在视频里添加文字呢 接下来由我分享几个易上手的方法 方法一 借助视频转文字助手视频转文字助手是一款智能视频 文
  • 我想做一个面向校园消费数据的可视化分析平台的设计与实现

    设计和实现一个面向校园消费数据的可视化分析平台需要满足以下几个步骤 数据收集 首先需要收集校园内各种消费数据 包括但不限于餐饮 购物 娱乐等消费数据 数据清洗 对收集的数据进行清洗 去除重复 缺失 错误等数据 数据存储 将清洗后的数据存储在
  • Ubisoft Connect失去连接解决办法

    Ubisoft Connect失去连接解决办法 原视频地址 育碧平台失去连接100 解决 哔哩哔哩 bilibili 首先打开服务 有两种方式 win R打开命令窗口输入services msc 打开任务管理器切换到服务选项卡 然后找到Sp
  • 基于Python的开源人脸识别库:离线识别率高达99.38%

    项目地址 https github com ageitgey face recognition face recognition 本文的模型使用了C 工具箱dlib基于深度学习的最新人脸识别方法 基于户外脸部数据测试库Labeled Fac
  • mysql innodb引擎什么时候表锁什么时候行锁?

    mysql innodb引擎什么时候表锁什么时候行锁 InnoDB基于索引的行锁 InnoDB行锁是通过索引上的索引项来实现的 这一点 ySQL与Oracle不同 后者是通过在数据中对相应数据行加锁来实现的 InnoDB这种行锁实现特点意味
  • 用Java写一个小游戏

    源码地址 https pan baidu com s 18y8Et8QnahhDdz7N 0Rsg 提取码 b3tr 游戏开始图片 如下 游戏胜利图片 如下 游戏分析 玩家控制键盘上下左右键 当数字按照从小到大依次排列的时候则玩家获胜 游戏
  • MATLAB如何将文本与数字进行线性回归比较?(已经解决)

    2 虽然导入进去了 但是文本是无法和数值进行比较的 所以我采用了一个替换的方式 就是把sex里面的male与female换成数字的 1 和 2 这样再把 1 和 2 换成double型就可以进行回归分析了 因为sex是cell型 是无法与d
  • LeetCode-109.有序链表转换二叉搜树

    二叉搜索树 二叉查找树又称二叉搜索树或者二叉排序树 它可以是一个空树或者是一个二叉树 既有链表的快速插入与删除的特点 又有数组快速查找的优势 具有以下性质 若左子树非空 则左子树所有节点均小于根节点的值 若右子树非空 则右子树所有节点均大于