将二叉搜索树转成要一个排序的双向链表

二叉搜索树转换成排序双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路 思路 二叉树的中序遍历是有序的,所以排序不用担心;难点在调整指针指向。 双向链表有三个域值域,前驱域和后继域。 二叉树的每一个节点也有三个域值域,left,right; 将left变为前驱,right变为后继,就能将二叉搜索树变为双向链表。 以节点1,3,4为例 第一步先写一个中序遍历出来 public void convertChild(TreeNode root){ 阅读详情

首先,详细了解下这个问题输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现。

其次,我们要知道在二叉搜索树中,每个结点都有两个分别指向其左、右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值。所以中序便是排序或者说是有序的

思路一:中序遍历的顺序即是我们所要建立链表的顺序。所以可以在中序遍历整棵树的同时,通过调整节点的指针来将其转换为双向链表。当所有结点都访问过之后,整棵树也就转换成一个排序双向链表了。

 思路二:当我们到达某一结点准备调整以该结点为根结点的子树时,先调整其左子树,将左子树转换成一个排好序的左子链表,再调整其右子树转换右子链表。最后链接左子链表的最右结点(左子树的最大结点)、当前结点和右子链表的最左结点(右子树的最小结点)。从树的根结点开始递归调整所有结点。


其实,在看完思路后,读者不禁会想,这跟中序线索化二叉树,好像一样,那我们来看看中序线索化二叉树


(PS:上图是普通二叉树的图,在这里只为讲解)

我们在看看,中序线索化

接下来,我们看其代码

int inorder_threading(bithrtree *thrt, bithrtree bt)  
{  
    *thrt = (bithrtree) malloc (sizeof(bithrnode));  
    if (!*thrt)  
        exit(OVERFLOW);  
                                                   /* 将头结点线索化 */  
    (*thrt)->ltag = link;  
    (*thrt)->rtag = thread;  
    (*thrt)->rchild = (*thrt);  
  
    if (!bt)                                     /* 若二叉树为空,则将lchild指向自己 */  
        (*thrt)->lchild = (*thrt);  
    else {  
        (*thrt)->lchild = bt;                   /* 头结点左指针指向根结点 */  
        pre = (*thrt);  
        in_threading(bt);                       /* 中序遍历进行中序线索化 */  
        pre->rchild = *thrt;  
        pre->rtag = thread;  
        (*thrt)->rchild = pre;  
    }  
    return OK;  
}

其实,可以看出大同小异,再来看看怎么将二叉搜索树转成要一个排序的双向链表


BinaryTreeNode<T>* Conver()
	{
		BinaryTreeNode<T>* list = NULL;
		ConverNode(_root,list);

		BinaryTreeNode<T>* head = list;
		while(head && head->_left)
			head = head->_left;

		return head;
	}

	void ConverNode(BinaryTreeNode<T>* cur ,BinaryTreeNode<T>*& prv)
	{
		if(cur == NULL)
			return;

		BinaryTreeNode<T>* tem = cur;

		if(cur->_left)
			ConverNode(cur->_left,prv);

		tem->_left = prv;

		if(prv)
			prv->_right = tem;

		prv = tem;
		if(cur->_right)
			ConverNode(cur->_right,prv);
	}
读者可以将两者比较看看。

426 将二叉搜索树转化为排序的双向链表 题目描述: 将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。 对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。 特别地,我们希望可以 就地 完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中最小元素的指针。 示例 1: 输入:root = [4,2,5,1,3] 输出:[1,2,3,4,5] 解释:下图显示了转化后的二叉搜索树,实线表示后继关系,虚线表 阅读详情

相关推荐

二叉搜索树与双向链表(Java)

题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向,比如输入下图中左边的二叉搜索树,则输出转换之后的排序双向链表。struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }思路1:在二叉树中,每个结点都有两...

Sweet Baby,甜宝 5455

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

将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。特别地,我们希望可以 就地 完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中最小元素的指针。示例 1 : 解释: 下图显示的是转化之后的二叉搜索树,图中的实线表示节点间的后继关系,而虚线表示节点间的前序关系。...

OceanStar的博客 1048

面试题1-将二叉搜索树转变成排序的双向链表

输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。        对于一棵二叉搜索树                                   若采用中序遍历,其遍历顺序为1-2-3-4-5-6-7,通过适当的指针变换操作,可变成的双向有序链表如下: 对于将其转换为双链表有两种思路:    首先看第一种思路:

土豆的博客 3927

LeetCode426之将二叉搜索树转化为排序的双向链表(相关话题:双向链表,二叉树中序)

将二叉搜索树通过中序遍历的方式,依次将节点放入队列中,放入队列中的节点顺序就是转换后双向链表的顺序。

数据与算法架构提升之路专栏 730

稀疏数据分析:马蹄估计量及其理论性质

稀疏数据分析:马蹄估计量及其理论性质基本框架half-Cauchy分布为什么它叫马蹄估计量后验均值、shrinkage与κ\kappaκθ\thetaθ的边缘先验分布的阶马蹄估计的一致性收敛速率Clarke-Barron(1990)引理马蹄估计的最优收敛速率 这是对The horseshoe estimator for sparse signal这篇论文的回顾,这篇论文在Modern Bayesian statistics与Bayesian Machine Learning领域比较重要,它提出了一种新的先验

一个不愿透露姓名的博客 3799

django安装mysqlclient (Windows下正确安装mysqlclient)

由于本人也是初学Python和django。本人使用的Python版本是3.7所以连接MySQL数据库需要安装数据驱动,对应Python3的数据驱动是mysqlclient。因此本人习惯性的使用命令pip install mysqlclient,结果安装失败 (venv) C:\Users\songlihui\PycharmProjects\autotest&gt;pip install my...

songlh1234的博客 2万+

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

本文介绍了一种将二叉搜索树(BST)就地转换为排序的循环双向链表的方法。通过递归地处理树的左右子树,将其转换为双向链表,并将链表的首尾相连,最终形成一个循环结构。实现代码利用了 C++ 的 pair 和 tie 来简化节点之间的连接逻辑,保证了算法的高效性和简洁性。

weixin_45092290的博客 1100

泛微E9开发 明细表字段赋值到主表字段,将各类型合计赋值到主表类型合计中

①绑定明细表类型、预计金额字段的值改变事件,每当有值发生改变,就需要重新计算供应商1、供应商2、供应商3的合计,如果不绑定这两个字段的话,会出现计算不及时或计算错误的问题。②当有明细行被删除时,也需要重新计算供应商1、供应商2、供应商3的合计,比如删除了供应商1的明细行,如果不重新计算,那么供应商1的值还是被删之前的值,合计错误。将各类型合计赋值到主表类型合计中。

a_waste_only的博客 3836

Python 二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整书中节点指针的指向。 class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: def C...

weixin_44208324的博客 287

戴尔G3/AWCC用户必看:揪出WMI Provider Host疯狂占用的元凶,附5.4.35旧版回退保姆级教程

本文针对戴尔G3/AWCC用户遇到的WMI Provider Host异常占用问题,提供了详细的诊断方法和解决方案。通过分析AWCC 5.5.14.0版本的资源占用问题,指导用户回退到稳定版AWCC 5.4.35,并附上保姆级教程和预防措施,帮助用户彻底解决系统卡顿问题。

weixin_30892037的博客 561

AI智能体赋能Cypress:自动化前端测试的新范式

自动化测试是现代软件工程保障质量的核心实践,其原理是通过脚本模拟用户操作,对软件功能进行验证。随着大语言模型(LLM)和智能体(Agent)技术的发展,测试自动化正迈向智能化新阶段。智能体能够理解自然语言描述的测试需求,并自主规划、执行测试步骤,这为应对前端UI频繁变更、测试用例维护成本高等挑战提供了新思路。在工程实践中,将Cypress这一流行的前端测试框架封装为智能体可调用的标准化技能(Skill),是实现这一愿景的关键。通过设计清晰的交互协议和状态管理机制,智能体可以像人类测试工程师一样“感知”页面状

weixin_33726318的博客 686

【剑指offer】二叉搜索树与双向链表 -- Python 实现

【题目描述】 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 【解题思路】 二叉搜索树中序遍历就是有序的,所以先将二叉树中序遍历的节点存储到列表中,然后对列表中的节点进行前后链接处理即可,用Python实现的代码如下: # -*- coding:utf-8 -*- # class TreeNode: # def __ini...

qq_36643449的博客 266

[cryoEM] cryoSPARC简介

cryoSPARC系统结构概述 cryoSPARC是一个后端和前端高性能计算软件系统,为单颗粒冷冻电镜提供数据处理和图像分析能力,以及丰富的基于浏览器的用户截面和命令行工具。 Master-worker模式 系统基于主用户模式。 主进程(web应用,核心应用程序和MongoDB数据库)一起在主节点上运行。主节点需要相对轻量级的资源(2+ CPU< 16GB+ RAM)。 工作程序进程可以在具有GPU的任何可用节点上生成,负责所有实际计算和数据处理,并由主节点调度。注意:同一节点可以同时充当主节点和辅

进阶中的程序员吃吃的博客 7797

二叉搜索时与双向链表python_[LeetCode] 426.将二叉搜索树转化为排序的双向链表

题目链接: https://leetcode-cn.com/problems/convert-binary-search-tree-to-sorted-doubly-linked-list难度:中等通过率:49.8%题目描述:将一个二叉搜索树就地转化为一个已排序的双向循环链表。可以将左右孩子指针作为双向循环链表的前驱和后继指针。为了让您更好地理解问题,以下面的二叉搜索树为例:我们希望将这个二叉搜索...

weixin_35196629的博客 140

备战数学建模38-粒子群算法pso番外篇1(攻坚战2)

粒子群算法最初是根据鸟类群体行为得到的启发,对鸟群行为进行仿真的算法,是一种启发式算法,也就是智能优化算法,利用信息共享,通过中间信息进行改进搜索,从而获得问题的可行解。我们简单从下图去体会一下粒子群算法,就是有多个鸟,每个鸟相当于一个粒子,每只鸟的位置受自己认知的历史最佳位置和当前距离食物最近的鸟的位置的影响。我们进一步分析这个图,可以得到两个公式,第一个是速度公式,即每只鸟的当前速度受上一步的速度惯性,自我认知和社会认知三部分影响,第二个是位置公式,即每只鸟的位置受上一位置和上一位置的速度的影响。

nuist_NJUPT的博客 1665

第七天 Labview进阶(7.2 与汇川PLC通信)

运行环境: Labview 2020 Autoshop v4.10.1.1 该文档中包括Labview程序和汇川PLC程序,可以完美实现Labview与汇川PLC的通信。具体的使用教程可以参考本人的相关文章,讲解详尽,请尽情享用!

weixin_38637405的博客 3527

二叉搜索时与双向链表python_LeetCode By Python: 426. 剑指Offer第2版36. 二叉搜索树与双向链表...

题目来源LeetCode 第426题 将二叉搜索树转化为排序的双向链表 (访问需要解锁)《剑指Offer第2版》第36题 二叉搜索树与双向链表题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。为了让您更好地理解问题,以下面的二叉搜索树为例:我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于...

weixin_36252618的博客 99

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

将二叉搜索树转化成有序的双向链表

问题描述: 输入一个二叉搜索树,将该二叉树转化成一个排序的双向链表。要求不能创建任何新的节点,只能够调整树中节点指针的指向。 二叉树的节点定义如下: struct Node{ int value; Node * left; Node * right; }; 由于该树是二叉排序树,所以每个根节点的左指针指向的是其左子树的最右下角的节点,右指针指向的应当是其右子...

HurryRabbit的博客 495

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

笔试面试之将2叉查找树转换为双向链表

<br /><br />输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。<br />比如将二元查找树<br />                                            10<br />                                          /    /<br />                                        6       14<br />  

Not_Plain的专栏 606

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

将二叉搜索树转换成一个排序的双向链表

将二叉搜索树转换成一个排序的双向链表 题目:将二叉搜索树转换成一个排序的双向链表。提示:要求不能创建任何新的结点,只能调整树中结点指针的指向,也就是left当prev,right当next。--中序线索化的变型。  在二叉搜索树中,每个结点都有两个指向子节点的指针,在双向链表中,每个结点也有两个指针,分别指向前一个结点和后一个结点。在二叉搜索树中,左子节点的值总是小于右子结点的值,

step_ma的博客 931

二叉搜索树与双向链表

二叉搜索树与双向链表

chenchenchencl的博客 4290

可视化图解算法27: 二叉搜索树转双向排序链表

对于二叉树的相关算法,我们总结了一套【可视化+图解】方法,依据此方法来解决相关问题,算法变得易于理解,写出来的代码可读性高也不容易出错。

weixin_42117918的博客 1115

Java二叉搜索树转换成一个排序的双向链表

题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。比如输入下图中二叉搜索树,则输出转换后的排序双向链表 在二叉搜索树中,每个结点都有两个分别指向其左、右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值。在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点。所以这两种数据结构的结点是一致,二叉搜索树和双向链表,只是因为两个指针的指向不同而已,通过改变其指针的指向来实现是完全可能的。举个例

luzhensmart的专栏 946

JZ26 二叉搜索树与双向链表

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路 二叉树用递归,代码简洁不易出错。 准备 理解二叉搜索树(不会的朋友自己百度) 不能创建任何新的结点,博主理解这句话的意思是题目不希望通过遍历来的值保存在新创建的二叉树中,而是希望通过我们操作指针来实现。 /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode

了凡 2232

【LeetCode 双向链表专项】将二叉搜索树转化为排序的双向链表(426)

【LeetCode 双向链表专项】将二叉搜索树转化为排序的双向链表(426)

weixin_37780776的博客 1861
上一篇: 判断一棵树是否为满二叉树
下一篇: mock浅析
Csoul89757
博客等级 码龄10年 34粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值