LeetCode 426. 将二叉搜索树转化为排序的双向链表

2023-10-30

将一个二叉搜索树就地转化为一个已排序的双向循环链表。可以将左右孩子指针作为双向循环链表的前驱和后继指针。

为了让您更好地理解问题,以下面的二叉搜索树为例:

我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。

下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。

特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。

下图显示了转化后的二叉搜索树,实线表示后继关系,虚线表示前驱关系。

算法:我们知道,返回的双向链表是排好序的,所以我们需要利用BST的中序遍历。我们先递归整个左子树,再递归整个右子树。需要注意的是,左子树最右边的结点的后继结点就是根结点,而右子树最左边的结点的前驱结点是根节点。为了对应这种关系,我们利用pair进行结点的存储。最后不要忘了做循环处理即可。

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;

    Node() {}

    Node(int _val, Node* _left, Node* _right) {
        val = _val;
        left = _left;
        right = _right;
    }
};
*/
class Solution {
public:
    pair<Node*, Node*>dfs(Node* root){
        if(!root->left&&!root->right)return {root,root};
        if(root->left&&root->right){
            auto ls=dfs(root->left), rs=dfs(root->right);
            ls.second->right=root,root->left=ls.second;
            rs.first->left=root,root->right=rs.first;
            return {ls.first, rs.second};
        }
        if(root->left){
            auto ls=dfs(root->left);
            ls.second->right=root,root->left=ls.second;
            return {ls.first, root};
        }
        if(root->right){
            auto rs=dfs(root->right);
            rs.first->left=root,root->right=rs.first;
            return {root, rs.second};
        }
        return {root,root};
    }
    Node* treeToDoublyList(Node* root) {
        if(!root)return NULL;
        auto side=dfs(root);
        side.first->left=side.second;
        side.second->right=side.first;
        return side.first;
    }
};

 

转载于:https://www.cnblogs.com/programyang/p/11161866.html

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

LeetCode 426. 将二叉搜索树转化为排序的双向链表 的相关文章

  • 数据库多维迭代算法

    关键词 数据库 迭代 递归 多维 一 两种传统的数据库迭代结构算法 对于数据库的迭代结构 有两种传统的算法 递归算法和边界算法 比如对于下面图1的结构 图1 递归算法的数据结构如表1所示 节点id 节点值 父节点id 1 1111 2 3
  • 算法--将数组分成和相等的多个子数组,求子数组的最大个数

    作者 陈太汉 一个整数数组 长度为n 将其分为m份 使各份的和相等 求m的最大值 比如 3 2 4 3 6 可以分成 3 2 4 3 6 m 1 3 6 2 4 3 m 2 3 3 2 4 6 m 3 所以m的最大值为3 算法 原理的思想是
  • 直线检测方法—LSD论文翻译

    附原文链接 LSD a Line Segment Detector 摘 要 LSD是一个线段检测器 能够在线性时间内得到亚像素级精度的检测结果 它无需调试参数就可以适用于任何数字图像上 并且能够自我控制错误数量的检测 平均来说 一个图像中允
  • 一文弄懂循环链表、双向链表、静态链表

    循环链表 双向链表 静态链表 三遍定律 理解了单链表本文的理解易如反掌 单链表请点击这里 理解了单链表本文的理解易如反掌 单链表请点击这里 理解了单链表本文的理解易如反掌 单链表请点击这里 1 循环链表 将单链表中终端结点的指针端由空指针改
  • Qt——用于表格QTableView的模型

    如果想使用表格来呈现数据 Qt提供了一个方便的部件QTableWidget 但是直接用它实现一些功能可能比较困难 这里将介绍一种强大 灵活的方式来操作表格 一 模型 视图架构 在这个架构中 模型用于存储数据 视图用于呈现数据 除此之外 还有
  • 数据结构----链式栈

    目录 前言 链式栈 操作方式 1 存储结构 2 初始化 3 创建节点 4 判断是否满栈 5 判断是否空栈 6 入栈 7 出栈 8 获取栈顶元素 9 遍历栈 10 清空栈 完整代码 前言 前面我们学习过了数组栈的相关方法 链接 线性表 栈 栈
  • PCL—低层次视觉—点云分割(RanSaC)

    点云分割 点云分割可谓点云处理的精髓 也是三维图像相对二维图像最大优势的体现 不过多插一句 自Niloy J Mitra教授的Global contrast based salient region detection出现 最优分割到底鹿死
  • 微软2013暑假实习生笔试题

    自己mark一下 以作后备 下面提交原文链接 原文博客 部分题目答案不确定 会持续更新 1 Which of the following calling convention s support s supportvariable leng
  • 数据结构与算法学习总结(六)——字符串的模式匹配算法

    基本概念 字符串是一种特殊的线性表 即元素都是 字符 的线性表 字符是组成字符串的基本单位 字符的取值依赖于字符集 例如二进制的字符集为0 1 则取值只能为 0 1 再比如英语语言 则包括26个字母外加标点符号 例如 abcde 就是一个字
  • 算法系列15天速成——第八天 线性表【下】

    一 线性表的简单回顾 上一篇跟大家聊过 线性表 顺序存储 通过实验 大家也知道 如果我每次向 顺序表的头部插入元素 都会引起痉挛 效率比较低下 第二点我们用顺序存储时 容 易受到长度的限制 反之就会造成空间资源的浪费 二 链表 对于顺序表存
  • UE4命令行使用,解释

    命令行在外部 从命令行运行编辑项目 1 导航到您的 LauncherInstall VersionNumber Engine Binaries Win64 目录中 2 右键单击上 UE4Editor exe 的可执行文件 并选择创建快捷方式
  • 4Sum

    Given an array S of n integers are there elements a b c and d in S such that a b c d target Find all unique quadruplets
  • OJ-合并两个有序链表

    题目描述 代码如下 Definition for singly linked list struct ListNode int val struct ListNode next struct ListNode mergeTwoLists s
  • Linux 内核中的 Device Mapper 机制

    Linux 内核中的 Device Mapper 机制 尹 洋 在读博士生 尹洋 中科院计算所国家高性能计算机工程技术研究中心的在读博士生 主要从事服务部署和存储资源管理以及Linux块设备一级的开发和研究工作 简介 本文结合具体代码对 L
  • 区块链中的哈希算法

    区块链中的密码学 密码学在区块链中的应用主要有两个 哈希算法与非对称加密算法 这次主要对哈希算法进行详细的说明 哈希算法 哈希算法的特点有 1 输入可以为任意大小的字符串 2 产生固定大小的输出 3 可以在合理的时间内算出输出值 若要满足密
  • 基数排序代码实现

    详情请看排序总结 传送门 https blog csdn net m0 52711790 article details 121914543 基数排序的知识点我就不贴出来 相信都能搜到对应概念解释 下面就直接上代码 代码解释其实也很清晰了
  • Leetcode1094. 拼车

    Every day a Leetcode 题目来源 1094 拼车 解法1 差分数组 对于本题 设 a i 表示车行驶到位置 i 时车上的人数 我们需要判断是否所有 a i 都不超过 capacity trips i 相当于把 a 中下标从
  • 【数据结构】双链表的定义和操作

    目录 1 双链表的定义 2 双链表的创建和初始化 3 双链表的插入节点操作 4 双链表的删除节点操作 5 双链表的查找节点操作 6 双链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • 浅谈归并排序:合并 K 个升序链表的归并解法

    在面试中遇到了这道题 如何实现多个升序链表的合并 这是 LeetCode 上的一道原题 题目具体如下 用归并实现合并 K 个升序链表 LeetCode 23 合并K个升序链表 给你一个链表数组 每个链表都已经按升序排列 请你将所有链表合并到
  • 高精度运算合集,加减乘除,快速幂,详细代码,OJ链接

    文章目录 零 前言 一 加法 高精度加法步骤 P1601 A B 二 减法 高精度减法步骤

随机推荐

  • SQLAlchemy映射已有数据表

    方法一 手动创建数据表模型类进行映射 映射的表必须要有主键 配置数据库连接参数 class Config SQLALCHEMY DATABASE URI mysql pymysql root 123456 localhost 3306 te
  • mysql5.7 免安装版的配置过程

    1 去官网下载mysql 5 7 2 解压压缩包 首先给压缩包重命名一下 修改为你自己想要的 将解压目录下默认文件 my default ini 拷贝一份 改名 my ini 3 修改一下my ini 文件里的内容 client port
  • 基于卷积神经网络结合注意力机制长短记忆网络CNN-LSTM-Attention实现风电功率多输入单输出回归预测附matlab代码

    作者简介 热爱科研的Matlab仿真开发者 修心和技术同步精进 matlab项目合作可私信 个人主页 Matlab科研工作室 个人信条 格物致知 更多Matlab仿真内容点击 智能优化算法 神经网络预测 雷达通信 无线传感器 电力系统 信号
  • Kafka安装及测试

    系统环境 Linux Ubuntu 16 04 jdk 7u75 linux x64 相关知识 Kafka是由LinkedIn开发的一个分布式的消息系统 使用Scala编写 它因可以水平扩展和高吞吐率而被广泛使用 目前越来越多的开源分布式处
  • WPF编程,通过Path类型制作沿路径运动的动画另一种方法。

    上一篇文章给了一个这方面的例子 那个文章里是通过后台按钮事件进行动画的开始 停止 继续等 这里给出的是通过前台XAML来实现 1 前台 定义路径 定义运动的主体 这里是一圆
  • IEEE 754 round-to-nearest-even

    IEEE 754 二进制的向偶舍入 舍入的值保证最靠近原浮点数值 如果舍入为中间值 即舍还是入距离相等 那么按其最末尾一位是奇数 则入 如果为偶数 则舍 下面例子说明 xxx yyyyy10000 x为实数任意值 y为任意值 最末尾y为需要
  • 用C++实现简单的小游戏

    采用面向对象的编程思想 在头文件中引入acllic图形库 实现c 控制图片以及生成可视化窗口 所需工具 acllib图形库下载地址 acl图形库下载地址 win32位项目的创建 通过visual studio创建win32项目 三张图片 t
  • python 数据分析--数据处理工具Pandas(2)

    数据处理模块 Pandas 4 Pandas处理字符串和日期数据 5 Pandas 数据清洗 5 1 重复观测处理 5 2 缺失值处理 5 2 1 删除法 5 2 2 替换法 5 3 异常值处理 6 获取数据子集 7 透视表 合并与连接 分
  • Transformer中的position encoding(位置编码一)

    本文主要讲解Transformer 中的 position encoding 在当今CV的目标检测最前沿 都离不开position encoding 在DETR VIT MAE框架中应用广泛 下面谈谈我的理解 一般position enco
  • Activity 的启动分析 ( 9.0 )

    Activity 的启动系统已经做了很多的封装 使得我们在开发的时候不用去关注底层的东西 需要一句代码就可以搞定拉起一个Activity Intent intent new Intent this TestActivity class st
  • Excel如何制作动态模糊匹配的下拉菜单?

    之前给大家分享了如何使用函数制作模糊匹配的下拉菜单 但函数那家伙的特点是小巧灵 数据量稍大 效率就比较差了 众所周知 在Excel里 高效率解决复杂问题 还是得靠又傻又愣的VBA 今天就再给大家分享一下 如何使用VBA制作更好用的动态模糊匹
  • python的label显示图片,如何在标签中显示图片和文本(PyQt)

    我需要在标签中显示图片和文本 这是我的代码 import sys from PyQt5 QtCore import from PyQt5 QtGui import from PyQt5 QtWidgets import class MyLa
  • 机械臂编程_建立自己的机械臂-编程

    机械臂编程 现在 手臂已经组装好了 是时候将其提升到一个新的水平 现在是释放野兽并完全控制整个机器人手臂的时候了 在这篇文章的结尾 您应该对如何对该机械臂进行编程以完成您想要的事情有一个想法 要了解我如何到达这里 请访问我以前的文章 该文章
  • Kubernetes 工作负载控制器Deployment和Replicaset

    Deployment 介绍 管理Pod和ReplicaSet 具有上线部署 副本设定 滚动升级 回滚等功能 提供声明式更新 例如只更新一个新的Image 应用场景 网站 API 微服务 Deployment 使用流程 项目生命周期 Depl
  • SpringCache入门

    1 简单介绍 Spring Cache 是 Spring 提供的一整套的缓存解决方案 虽然它本身并没有提供缓存的实现 但是它提供了一整套的接口和代码规范 配置 注解等 这样它就可以整合各种缓存方案了 比如 Redis Ehcache 我们也
  • java 对象获取堆_【性能优化】面试官:Java中的对象和数组都是在堆上分配的吗?...

    写在前面 从开始学习Java的时候 我们就接触了这样一种观点 Java中的对象是在堆上创建的 对象的引用是放在栈里的 那这个观点就真的是正确的吗 如果是正确的 那么 面试官为啥会问 Java中的对象就一定是在堆上分配的吗 这个问题呢 看来
  • 单元测试方法总结

    1 引言 应用系统的实施代码构建完成之后 并不代表项目已经结束 至少还有系统测试 部署以及性能调优等工作需要完成 测试的目的是检验开发结果是否满足规定需求 测试时保证软件质量的重要手段 是软件开发不可缺少的组成部分 虽然测试是一件乏味的工作
  • Mysql查询字符串中某个字符串出现的次数

    目录 1 查单个字符出现的次数 2 查多个字符出现的次数 3 函数讲解 1 查单个字符出现的次数 比如我想查how do you do 字符串当中出现d的次数 第一眼看上去有点懵 首先mysql并没有直接计算出现字符次数的函数 所以才使用了
  • React/React Native之状态机原理

    在讲React React Native状态机原理之前 先让大家看一个春哥用React编写的小案例的网页效果图 当文本框中的内容发生变化时 会将文本框中的内容同步输出 按照我们之前Android和iOS的思维 当文本框中内容发生变化时 它会
  • LeetCode 426. 将二叉搜索树转化为排序的双向链表

    将一个二叉搜索树就地转化为一个已排序的双向循环链表 可以将左右孩子指针作为双向循环链表的前驱和后继指针 为了让您更好地理解问题 以下面的二叉搜索树为例 我们希望将这个二叉搜索树转化为双向循环链表 链表中的每个节点都有一个前驱和后继指针 对于