二叉搜索树与双向链表

二叉搜索树转换为有序双向链表 一、问题描述 输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现。 二、实现思路 在二叉搜索树中,每个结点都有两个分别指向其左、右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值。而在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点。所以这两种 阅读详情

引言:

当刷到这一题时,我一开始感到无从下手。看了一下题解,瞬间恍然大悟。因此写下这篇题解,一方面希望自己对这道题有深刻的认识,另一方面,帮助一些和我一样看到此题无从下手的同学。

题目:二叉搜索树和循环链表

题目链接
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
为了让您更好地理解问题,以下面的二叉搜索树为例:
在这里插入图片描述
我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。
在这里插入图片描述
特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。

题解:

首先看到二叉搜索树,首先就要想到中根遍历。中根遍历的模板就是递归遍历左子树,然后对当前节点进行处理,最后递归遍历右子树。所以在此题中,处理节点的顺序就是1,2,3,4,5.所以相当于依次给你这五个节点,看你如何把这5个节点变成双向链表。
首先声明两个指针,一个是链表头结点head,另一个就是处理当前节点的指针pre。当处理第一个节点1时,head和pre都指向1,处理第二个节点root(2)时,让pre的right指针指向root(2),然后root的left指针指向pre,这时连成双向链表了嘛。然后让pre指向当前的root,继续向后连接节点即可。
注意在中根遍历中连接节点时并没有把首尾节点相连,所以要在调用中根遍历后把首尾相连。

代码:

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

    Node() {}

    Node(int _val) {
        val = _val;
        left = NULL;
        right = NULL;
    }

    Node(int _val, Node* _left, Node* _right) {
        val = _val;
        left = _left;
        right = _right;
    }
};
*/
class Solution {
public:
    Node* head,*pre;
    void dfs(Node* root)
    {
        if(root==NULL)  return ;
        dfs(root->left);
        if(head==NULL)
        {
            head=root;
            pre=root;
        } 
        else{
            pre->right=root;
            root->left=pre;
            pre=root;
        }
        dfs(root->right);
    }
    Node* treeToDoublyList(Node* root) {
        if(root==NULL) return NULL;
        head=NULL;
        dfs(root);
        head->left=pre;
        pre->right=head;
        return head;
    }
};
二叉搜索树与双向链表(Java) 题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向,比如输入下图中左边的二叉搜索树,则输出转换之后的排序双向链表。struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }思路1:在二叉树中,每个结点都有两... 阅读详情

相关推荐

二叉搜索树 转为 双向链表,

二叉搜索树 转为 双向链表, 导入eclipse时要改包名package classOne; BST To Double LinkedList change package name,

算法:二叉搜索树与双向链表

学习算法,不仅能让自己思维能力更是一个台阶,也能在大数据和人工智能时代为自己打下坚实的基础,成为互联网行业的高端人才,而不是一直停留在低水平的体力编程层次。

孤芳不自赏 509

面试题27_二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 包含二叉树的建立,测试输出。。可直接运行。。

二叉树搜索树与双向链表

牛客题目JZ36 二叉树搜索树与双向链表

shylyly_的博客 417

面试题36. 二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。 下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。 特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。 分析: 由于这个题

Arduino智能小灯DIY:人体感应+光线感应+蓝牙控制全攻略(附完整代码)

本文提供了一份完整的Arduino智能小灯DIY制作指南。项目融合了人体感应、光线感应与蓝牙控制三大功能,通过详细的硬件清单、电路连接图、核心逻辑讲解及附带的完整代码,手把手教你打造一个能自动感知环境与人、并支持手机远程控制的智能照明装置,是入门智能家居和物联网开发的绝佳实践。

java5的博客 1094

二叉搜索树与双向链表——js

二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路 解法一: 基础的递归 1.构建左子树为双向链表,返回链表头节点left 2.定位到左双向链表最后一个节点 3.左双向链表最后一个节点与当前节点双向链接 4.构建右子树为双向链表,返回链表头结点right 5.将右双向链表头节点和当前节点连接起来 解法二:...

qq_40608516的博客 898

2023西工大NOJ (C语言版) 完结!!!

代码均可AC,不含解析。

annesede的博客 8万+

二叉搜索树与双向链表Java

题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的方向。 思路:在二叉搜索树中,左子结点的值总是小于父子结点的值,右子结点的值总是大于父结点的值。因此在转换成排序的双向链表时,原先指向左子节点的值调整为 链表中指向前一个结点的指针,原先指向右子结点的指针调整为链表中指向后一个结点的指针。 根结点,左子树和右子树。在把左,右

冬青的专栏 1298

ESP32 开发实战:VS Code 头文件波浪线及编译错误的终极解决方案

本文针对ESP32开发者在VS Code中常见的头文件红色波浪线和fatal error编译错误,提供了终极解决方案。通过详细讲解如何配置c_cpp_properties.json文件来修复编辑器智能提示,以及如何修改CMakeLists.txt来修正编译器路径,帮助开发者彻底解决环境配置问题,提升开发效率。

prometheus9mon的博客 294

Cadence Sigrity PowerSI实战:从.brd到S参数提取的完整避坑指南

本文详细介绍了使用Cadence Sigrity PowerSI进行信号完整性分析的完整流程,从.brd文件预处理到S参数提取的关键技巧。通过实战案例和避坑指南,帮助工程师高效解决高速PCB设计中的信号质量问题,提升仿真精度和设计效率。

carrot的博客 695

JZ36. 二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表,如下图所示: 注意: 要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中结点的左指针需要指向前驱,树中结点的右指针需要指向后继。 返回链表中第一个结点的指针。 函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构。 你不用输出双向链表,程序会根据你的返回值自动打印输出。 示例:  输入:{10, 6, 14, 4, 8, 12, 16}  返回值:From left to right:4, 6,

2021dragon的博客 1096

Cesium实战:5分钟搞定离线地图与地形加载(附避坑指南)

本文详细介绍了Cesium在内网环境下的离线部署实战方案,重点解决了影像与地形数据的本地加载问题。通过逐步指导项目配置、本地瓦片与自定义地形数据的处理,并优化相机控制体验,帮助开发者快速构建安全、高效的三维地球应用,避免常见的401错误与加载失败陷阱。

weixin_30632089的博客 282

二叉搜索树转换为双向链表

二叉搜索树转换成对应的双向链表,不能生成新的节点,只允许改变节点的的指针。解题思路:由于按照中序遍历方法遍历二叉搜索树得到的结果是有序的,因此可以按照中序遍历方法遍历搜索树。定义函数BinaryTreeNode* Transfer(BinaryTreeNode* root),该函数将以节点root为根节点的二叉树转换为对应的有序双向链表,并返回该双向链表的头节点指针。具体代码如下:// Conso

zhangchuan的博客 396

【常见开源库的二次开发】基于openssl的加密与解密——openssl认识与配置(一)

OpenSSL 是一个开源的软件库,它提供了一系列加密工具和协议,主要用于实现安全通信,如在网络上的数据传输。它支持多种加密算法,包括对称加密、非对称加密、散列函数、伪随机数生成器、数字签名、密钥交换以及证书管理等。

嵌入式技术开发 4162

在Ubuntu系统中安装和使用wxPython进行Python图形用户界面(GUI)开发

在本文中,我将向您展示如何在Ubuntu系统上安装和使用wxPython,并提供一些示例代码来帮助您开始使用这个强大的工具。在MyFrame的构造函数中,我们创建了一个wx.Panel和一个按钮,并将按钮的点击事件绑定到一个自定义的方法on_button_click上。最后,我们创建了一个wx.App的实例,创建了一个MyFrame对象并显示它,最后通过调用app.MainLoop()启动应用程序的主事件循环。这只是一个简单的示例,但它演示了如何使用wxPython创建一个基本的GUI应用程序。

qq_37934722的博客 1040

二叉搜索树与双向链表【Java】

题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 问题描述: 二叉搜索树:左小由大,最后要转换程一个排序的,记住,是排序的,双向链表。 那问题就很简单了:换句话说就是树的中序遍历或者说中根遍历。 代码: import java.util.ArrayList; import java.util.Lis...

super_this_part的博客 222

《AgentScope-Java 深入浅出教程》第8章 工具高级特性

掌握工具组、预设参数、执行上下文等高级特性。

步子哥的博客 266

Leetcode 二叉搜索树与双向链表

leetcode 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 思路: 得到一个排序的数组,二叉搜索树的特点是,左子树<=根节点<=右子树,用中序遍历二叉搜索树就可以得到一个递增数列了 对于循环双向列表,先构造双向列表,再将头尾相连 """ # Definition for a Node. class Node:...

成长之路 521

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: 圆和矩形是否有重叠
下一篇: 浅谈STL中的vector
追梦少年ML
博客等级 码龄7年 36粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值