【LeetCode刷题(数据结构与算法)】:将二叉搜索树转化为排序的双向链表

news2024/12/26 2:29:25

在这里插入图片描述
将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表
对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点
特别地,我们希望可以 就地 完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中最小元素的指针
示例 1:
输入:root = [4,2,5,1,3]
在这里插入图片描述

输出:[1,2,3,4,5]
解释:下图显示了转化后的二叉搜索树,实线表示后继关系,虚线表示前驱关系
在这里插入图片描述
示例 2:
输入:root = [2,1,3]
输出:[1,2,3]
示例 3:
输入:root = []
输出:[]
解释:输入是空树,所以输出也是空链表
示例 4:
输入:root = [1]
输出:[1]
如何遍历树
遍历树的一般策略有两种:
深度优先搜索 (DFS) 在这种策略中,我们将 深度 作为优先级,因此我们从根节点开始,一路搜索到某个叶子节点,然后返回根节点寻找另一条分支。DFS 策略可以进一步区分为 前序,中序 和 后序,这取决于根节点、左节点和右节点之间的相对顺序
广度优先搜索 (BFS) 我们按照高度的顺序,从上到下扫描整棵树 高层级的节点会比低层级的节点先被访问 在下面的图像中,节点按照你访问它们的顺序进行编号,请按照 1-2-3-4-5 的顺序比较不同的策略
在这里插入图片描述
这个问题是以教科书递归方式实现 DFS 中序遍历,因为它要求就地(in-place)操作

方法:递归

算法 标准的中序递归遵循 左 -> 节点 -> 右 的顺序,其中 左 和 右 部分是递归调用,而 节点 是所有处理过程的执行场所。 处理在这里基本上是将前一个节点与当前节点相连,并记录到目前为止新双向链表中的最大节点,亦即最后一个节点
再多一个细节:需要保留第一个,即最小的节点,以封闭双向链表的环。 这是算法的步骤:
初始化 first 和 last 节点为 null
调用标准的中序递归 helper(root) :
如果节点不为 null:
调用左子树的递归 helper(node.left)
如果 last 节点不为 null,将 last 和当前 node 节点连接起来
若 else,则初始化 first 节点
将当前节点标记为最后一个节点:last = node
调用右子树的递归 helper(node.right)
将首尾两个节点连接起来,封闭 DLL 环,然后返回 first 节点
在这里插入图片描述
在这里插入图片描述

/*
// Definition for a Node.
struct Node {
    int val;
    struct Node* left;
    struct Node* right;
};
*/
void helper(struct Node*node,struct Node**first,struct Node**last)
{
    if(node){
        helper(node->left,first,last);
        if(*last){
            (*last)->right=node;
            node->left=*last;
            }
        else{
            *first=node;
        }
        *last=node;
        helper(node->right,first,last);
    }
}
struct Node* treeToDoublyList(struct Node *root) {
    struct Node*first=NULL;
    struct Node*last=NULL;
    if(root==NULL)
    {
        return root;
    }
    else
    {
        helper(root,&first,&last);
        last->right=first;
        first->left=last;
    }
    return first;
}

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

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

相关文章

pip 时报错 no such option: --bulid-dir 的解决办法

Pycharm 安装第三方库报错及解决方案——no such option: --build-dir Pycharm 安装第三方库报错及解决方案——no such option: --build-dir 最近在学习路径规划相关内容,在运行GitHub上下载例程时缺少“plotly”库,根据网上查到的安装步骤操作&#x…

计算机组成原理 new08 电路 $\color{red}{Δ}$

文章目录 ALU基本逻辑运算复合逻辑的运算 一位全加器串行加法器串行进位的并行加法器并行进位的并行加法器(全先行进位加法器)这个明天再写。加法电路原理总结ALU和加法器有什么关系加法器原理ALU总结无符号整数/补码加减法加法器标志位的生成补码加减法发运算的溢出判断溢出电…

Python实现一个简单的http服务,Url传参输出html页面

摘要 要实现一个可以接收参数的HTTP服务器,您可以使用Python标准库中的http.server模块。该模块提供了一个简单的HTTP服务器,可以用于开发和测试Web应用程序。 下面是一个示例代码,它实现了一个可以接收参数的HTTP服务器: 代码…

C1N短网址 - 是如何做到行业领先的

今天从技术角度来聊下短网址的一些事情,市面上的短网址发展基本上经历了几个阶段。 短网址发展的几个阶段: 第一阶段:网址缩短,很纯粹的功能,各个大小公司都在做,门槛很低。典型代表:百度短网…

Python+playwright 实现Web UI自动化

实现Web UI自动化 技术:Pythonplaywright 目标:自动打开百度浏览器,并搜索“亚运会 金牌榜” 需安装:Playwright (不用安装浏览器驱动) # 使用浏览器,并可视化打开 browser playwright.ch…

Power BI 傻瓜入门 3. 选择Power BI的版本

本章内容包括: Excel与Power BI的比较选择Power BI的桌面版和服务版之间的差异了解Microsoft提供的许可选项 挑选正确版本的Power BI可能就像参观世界上最大的糖果店:你可以从许多细微差别的替代品中进行选择。选择可以归结为想要、需要、规模&#xf…

用HFSS仿真平面线圈的电感量

用HFSS工具仿真平面线圈的电感量 平面线圈是指在平面上绕制而成的线圈,如PCB上的电感线圈、无线供电使用的金属丝绕制而成的线圈等。根据线圈的不同形状可将平面线圈分为方形线圈,六角形线圈、八角形线圈、螺旋原型线圈等。 网络上的计算平面线圈电感量…

Tmux:终端复用器的基本使用(二)

相关阅读 Tmuxhttps://blog.csdn.net/weixin_45791458/category_12472796.html?spm1001.2014.3001.5482 上一篇文章列举了一些关于tmux中会话的基本使用方法,但会话并非是tmux的最强大的功能,tmux还能在一个会话中创建多个窗口(windows),并…

springboot配置打野sql语句,而不打印结果

application.yml,注释掉mybatis-plus,增加logging,级别debug

【暴力剪枝】CF1708D

https://codeforces.com/contest/1708/problem/D 题意 思路 这样的操作下,数列减的速度是非常快的,也就是说,易出现很多的0,0的操作没啥意义,所以我们要找到第一个 >0 的数对其后的序列进行排序,就能大…

Vue中的路由是如何工作的?Vue Router的基本用法。

在Vue中,路由是用于管理应用程序中不同页面之间导航的机制。 Vue Router是Vue.js官方提供的路由管理器,它通过集成到Vue应用程序中,提供了一种简单而强大的方式来实现单页应用程序(SPA)的路由功能。 以下是Vue Router的基本用法: 1:安装Vue Router: 首先,使用npm或…

二维码智慧门牌管理系统升级解决方案:地图展示

文章目录 前言一、地图展示功能二、其他升级和改进 前言 随着城市的发展和信息化建设的推进,二维码智慧门牌管理系统在社区管理、物流配送、巡检巡查等多个领域发挥着越来越重要的作用。为了更好地满足用户需求,提升管理效率和服务质量,我们…

【JavaEE重点知识归纳】第9节:抽象类和接口

目录 一:抽象类 1.概念 2.语法 3.特性 4.作用 二:接口 1.概念 2.语法 3.接口使用 4.特性 5.实现多个接口 6.接口间的继承 7.Comparable接口 8.Clonable接口 9.抽象类和接口的区别 一:抽象类 1.概念 (1&#xff0…

【C++】类型转换(dynamic_cast,const_cast,static_cast,reinterpret_cast)

🌏博客主页: 主页 🔖系列专栏: C ❤️感谢大家点赞👍收藏⭐评论✍️ 😍期待与大家一起进步! 文章目录 C语言中的类型转换一、static_cast二、reinterpret_cast三、 const_cast四、 dynamic…

xlive.dll下载安装方法分享,教你快速修复xlive.dll文件

在运行某些应用程序或游戏时,你可能会遭遇到"xlive.dll缺失"错误提示,这可能导致程序无法正常运行。本文将向你介绍一些可行的解决方法教你下载xlive.dll文件,并详细阐述xlive.dll是什么文件以及导致其缺失的原因。 一.理解"x…

2023-10-19 指针与指针的指针,我就不信你脑壳不疼

点击 <C 语言编程核心突破> 快速C语言入门 指针与指针的指针&#xff0c;我就不信你脑壳不疼 前言一、从一个链表实现说起二、指针, 指针的指针, 头疼的来源总结 前言 C实现一个链表&#xff0c;为什么有时候传入指针&#xff0c;有时候传入指针的指针&#xff0c;究竟…

编程接口:eBPF 程序是怎么跟内核进行交互的?

目录 背景 BPF 系统调用 BPF 辅助函数 BPF 映射 BPF 类型格式 (BTF) 小结 背景 用高级语言开发的 eBPF 程序&#xff0c;需要首先编译为 BPF 字节码&#xff0c;然后借助 bpf 系统调用加载到内核中&#xff0c;最后再通过性能监控等接口与具体的内核事件进行绑定。这样&…

VNC Viewer安装教程(保姆级安装)

一、 VNC Viewer简介 VNC是一款开源的远程控制软件&#xff0c;功能强大且高效实用&#xff0c;其性能不逊色同类软件&#xff0c;它的工作原理和WIN远程控制软件类似&#xff0c;但是更为重要的是&#xff0c;VNC-Viewer完全免费开源&#xff0c;更新速度也比较快&#xff01;…

解释CSS伪类和伪元素的区别,并举例说明。

CSS伪类和伪元素是用于选择HTML文档中特定元素或元素的部分内容的CSS选择器。它们的区别在于它们所选择的目标不同。 CSS伪类&#xff08;Pseudo-classes&#xff09;是用于选择符合特定状态或特定条件的元素。伪类以冒号&#xff08;:&#xff09;开头&#xff0c;用于选择元…

【VSCode】解决Open in browser无效

问题描述&#xff1a; 在VSCode中无论是点击右键&#xff0c;选择在默认浏览器中打开&#xff0c;还是按快捷键alt b都没有反应。 解决办法&#xff1a; 右击文件 --> 在文件资源管理器中显示 右击文件&#xff0c;选择属性 点击更改 选择用默认浏览器打开 最后 此时…