二叉搜索树与双向链表

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

 题目链接:

https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

解题思路:

1.将左子树构造成双链表,并返回链表头节点。

2.定位至左子树双链表最后一个节点。

3.如果左子树链表不为空的话,将当前root追加到左子树链表。

4.将右子树构造成双链表,并返回链表头节点。

5.如果右子树链表不为空的话,将该链表追加到root节点之后。

6.根据左子树链表是否为空确定返回的节点。

/*解题思路:
1.将左子树构造成双链表,并返回链表头节点。
2.定位至左子树双链表最后一个节点。
3.如果左子树链表不为空的话,将当前root追加到左子树链表。
4.将右子树构造成双链表,并返回链表头节点。
5.如果右子树链表不为空的话,将该链表追加到root节点之后。
6.根据左子树链表是否为空确定返回的节点。
*/

public class Solution {
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree == null){
            return null;
        }
        
        if(pRootOfTree.left == null && pRootOfTree.right == null){
            return pRootOfTree;
        }
        
      // 1.将左子树构造成双链表,并返回链表头节点
        TreeNode left = Convert(pRootOfTree.left);
        
        TreeNode p = left;
        
       //2.定位至左子树双链表最后一个节点。
        while(p != null && p.right !=null){
             p = p.right;
        }
        
   //3.如果左子树链表不为空的话,将当前root追加到左子树链表。
        if(left !=null){
            p.right =  pRootOfTree;
            pRootOfTree.left = p;
        }
      
        //4.将右子树构造成双链表,并返回链表头节点。
        TreeNode right = Convert(pRootOfTree.right);
        
      //5.如果右子树链表不为空的话,将该链表追加到root节点之后。
         if(right !=null){
           pRootOfTree.right = right;
           right.left = pRootOfTree;
         } 
        //6.根据左子树链表是否为空确定返回的节点。
        return left == null? pRootOfTree:left;
    }
}

 用了集合来存储中序遍历的结果:

import java.util.*;
public class Solution {
    
    List<TreeNode> list = new ArrayList<>();
    
    public TreeNode Convert(TreeNode pRootOfTree) {
        if(pRootOfTree == null){
            return null;
        }
        mid(pRootOfTree);
   
        return convert();
    }
    
    public void mid(TreeNode root){       
        if(root != null){
            if(root.left !=null){
                 mid(root.left);
            }
            list.add(root);
            if(root.right !=null){
                 mid(root.right);
            }
        }
    }
    
    public TreeNode convert() {
        int i = 0;
        while(list.size() - 1 > i ){
            list.get(i).right = list.get(i + 1);
            list.get(i + 1).left = list.get(i);
            i++;
        }
        return list.get(0);
    }
    
}

 

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

相关推荐

SAP ERP销售应收&成本科目确定

ERP作为业财一体软件,其中最核心的就是业务与财务模块的自动集成,无需财务进行手工做账,提高工作效率的同时降低人工操作产生的误差。今天浅浅的分享一下SD模块生成会计凭证时,借贷项确定的系统配置。一般项目上借贷项、科目都有FICO提供,但是具体的集成配置是在SD这边。

weixin_43657667的博客 1569

剑指 Offer 36. 二叉搜索树与双向链表(golang版)

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 要求不能创建任何新的结点,只能调整树中结点指针的指向。 代码 package main import ( "fmt" ) type TreeNode struct { Val int Left *TreeNode Right *TreeNode } var pre *TreeNode func Convert( pRootOfTree *TreeNode ) *TreeNode { if pRootOfT.

admin_o1的博客 311

RocketMq面板访问异常 com.alibaba.fastjson.JSONException: not close json text, token : string

rocketmq JSONException: not close json text, token : string 问题解决

qq_21067307的博客 5573

剑指 Offer 36. 二叉搜索树与双向链表(递归)1

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

秋雨行舟 458

长短期记忆网络(LSTM)预测模型及其Python和MATLAB实现

LSTM 通过独特的门控机制解决了传统 RNN 的梯度消失和梯度爆炸问题,使其在处理长序列时具有显著优势。随着技术的不断发展,LSTM 及其变种(如 Bi-directional LSTM、Stacked LSTM 等)有望在更复杂的任务中发挥重要作用。2. **可视化真实值和预测值**:通过绘图来比较真实值和预测值,判断模型的准确性。2. **输入门(Input gate)**:决定当前的输入信息对细胞状态的影响。1. **细胞状态(Cell state)**:保持信息在时间步之间的传递。

qq_45441438的博客 2055

从涡流求解器到瞬态场:Maxwell 3D里无线充电仿真,选对求解器能省一半计算时间

本文深入探讨了Maxwell 3D在无线充电仿真中涡流求解器与瞬态求解器的选择策略,帮助工程师优化计算效率与精度。通过对比分析两种求解器的适用场景、性能差异及实战技巧,揭示如何根据频率特性、材料非线性和动态过程需求做出精准选择,可节省高达50%的计算时间。特别针对3D线圈模型的无线充电系统设计提供了专业建议。

weixin_26861329的博客 230

二叉搜索树和双向链表

1. 2. public class Solution { public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree==null) return null; if(pRootOfTree.left==null && pRootOfTree.r...

susuxuezhang的博客 202

SpringDoc 基本使用指南

SpringDoc 凭借零配置启动注解简洁和深度兼容 Spring 生态的优势,已成为 Spring Boot API 文档的首选工具。自动化- 减少手动维护文档的成本;标准化- 严格遵循 OpenAPI 3 规范;可扩展- 分组、安全控制灵活适配复杂项目。访问即可查看交互式文档(默认路径)

墨鸦的博客 1万+

剑指offer第2版36题:二叉搜索树与双向链表

小渣渣的算法学习笔记:2018秋招备战数据结构类算法总结:二叉树 链表1.题目描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 要求不能创建任何新的结点,只能调整树中结点指针的指向。2.代码实现:public class Solution36 { private static class TreeNode { int val = 0; Tr...

NebulaNem的博客 206

Linux中Hadoop 集群搭建

零、下载Hadoop: http://archive.cloudera.com/cdh5/cdh/5/?tdsourcetag=s_pctim_aiomsg 一、集群规划: 搭建的 hadoop 集群由 3 台服务器组成,分别叫做 master,salve1 和 slave2。其中 master 作为主节点,slave1 和 slave2 作为从节点。 二、网络配置: 1.查看 3 个节点的主机名...

白墨的小白博客 3992

YOLOv8改进-bifpn

跨尺度连接通过添加一个跳跃连接和双向路径来实现,自此实现了加权融合和双向跨尺度连接。该结构是加权且双向连接的,即自顶向下和自底向上结构,通过构造双向通道实现跨尺度连接,将特征提取网络中的特征直接与自下而上路径中的相对大小特征融合,保留了更浅的语义信息,而不会丢失太多的深层语义信息。传统的特征融合时将尺度不同的特征图以相同权重进行加权,但是当输入的特征图分辨率不同时,以相同的权重进行加权对输出的特征图不平等。所以BiFPN根据不同输入特征的重要性设置不同的权重,同时反复采用这种结构来加强特征融合。

weixin_45303602的博客 8139

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

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

qq_40608516的博客 898

4、高级认证解决方案:Active Directory、LDAP、RADIUS和TACACS+深度解析

本文深入解析了多种高级认证解决方案,包括Active Directory、标准LDAP、RADIUS和TACACS+,涵盖其技术优势、配置步骤及适用场景。同时介绍了如何实现通用用户管理,包括使用第三方认证解决方案和ADSI自助用户管理。通过实际案例部署,展示了如何高效、安全地管理大规模用户认证与权限控制,为企业安全架构提供参考。

o4p5q6r7s的博客 304

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

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

super_this_part的博客 221

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

zhangchuan的博客 396

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

二叉搜索树与双向链表Java

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

冬青的专栏 1298

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

剑指offer:Python 二叉搜索树与双向链表 递归实现二叉搜索树转双向链表 非递归实现二叉搜索树转双向链表

二叉搜索树与双向链表 的转换 图解 和多种实现方式!

storyfull 408

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

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

2021dragon的博客 1096

牛客——二叉搜索树与双向链表

数据范围:输入二叉树的节点数 0≤n≤1000,二叉树中每个节点的值 0≤val≤1000。输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求:空间复杂度O(1)(即在原树上操作),时间复杂度 O(n)双向链表的其中一个头节点。

允诺@晴天的博客 2557
上一篇: 二叉搜索树的后序遍历序列
下一篇: 二叉树的深度
ITgo
博客等级 码龄9年 14粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值