二叉搜索树与双向链表(牛客网 和 剑指 Offer同类型题)

news2024/9/27 15:35:52

文章目录

  • JZ36 二叉搜索树与双向链表(牛客网)
  • 剑指 Offer 36. 二叉搜索树与双向链表


JZ36 二叉搜索树与双向链表(牛客网)

题目链接

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示
在这里插入图片描述
注意:
1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
2.返回链表中的第一个节点的指针
3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构
4.你不用输出双向链表,程序会根据你的返回值自动打印输出

思路,在二叉树中,每个节点都有两个指向子节点的指针。在双向链表中,每个节点也有两个指针,分别指向前一个节点和后一个节点。这两种节点的结构很相似,二叉搜索树是一种排序的数据结构,它的左子节点的值总是小于父节点的值,右子节点的值总是大于父节点的值。

原先指向左子节点的指针,调整为链表中指向前一个节点的指针。
原先指向右子节点的指针,调整为链表中指向后一个节点的指针。

我们用一个具体的例子来做进一步的分析,当我们执行中序遍历到根节点的时候,就可以把树看成3部分 ①值为10的节点 ②根节点值为6的左子树 ③根节点值为14的右子树
在这里插入图片描述

根据排序链表的定义,值为10的节点将和它的左子树中的最大节点(值为8的节点)链接起来,同时它还将和右子树中最小的节点(值为12的节点)链接起来,如下图所示,将其拆成了根节点、左、右子树,我们把左子树与右子树都转换成双向链表之后再和根节点链接起来,整颗二叉搜索树也就转成了排序双向链表。
在这里插入图片描述

按照中序遍历的顺序,当我们遍历转换到根节点(值为10的节点)时,它的左子树已经转换成一个排序的链表了,并且处在链表中的最后一个节点时当前值最大的节点。我们把值为8的节点和根节点链接起来,此时链表中的最后一个节点就是10了。接着我们去遍历转换右子树,并把根节点和右子树中最小的节点链接起来。
左、右子树节点转换的过程跟遍历的过程是一样的,因此我们可以用递归来解决问题。

代码:

class Solution {
public:
    void Inorder(TreeNode* cur,TreeNode*& prev)  //采用应用可以当前节点的上一个节点
    {
    	//判空,如果为空则不需要链接
        if(cur==nullptr)return;
        Inorder(cur->left,prev);
        //当前left指向前一个
        cur->left=prev;
        //当前right指向后一个
        if(prev)prev->right=cur;
        //更新prev
        prev=cur;
        Inorder(cur->right,prev);
    }
    TreeNode* Convert(TreeNode* pRootOfTree) {
        TreeNode* prev=nullptr;
        Inorder(pRootOfTree,prev);
        TreeNode* ret=pRootOfTree;
        //要返回的节点值为最小值的节点,也就是二叉排序树的最左节点
        while(ret&& ret->left)ret=ret->left;
        return ret;
    }
};

递归展开图 6当根节点举例
在这里插入图片描述

剑指 Offer 36. 二叉搜索树与双向链表

题目链接

思路同上,由于此题需建立双向循环链表,所以我们只需找到二叉树搜索树的最左节点和最右节点进行首尾互连即可,因为二叉搜索树最左节点为二叉搜索树中最小元素,二叉搜索树最右节点为二叉搜索树最大节点。

代码:

class Solution {
public:
    void Inorder(Node* cur,Node*& prev)
    {
        if(cur==nullptr)return;

        Inorder(cur->left,prev);
        //当前left指向前一个
        cur->left=prev;
        //当前right指向后一个
        if(prev)prev->right=cur;
        //更新prev
        prev=cur;
        Inorder(cur->right,prev);
    }
    Node* treeToDoublyList(Node* root) {
        if(root==NULL)return NULL;
        Node* prev=nullptr;
        Inorder(root,prev);
        //首位互连部分代码
        Node* _left=root;
        while(_left&& _left->left)_left=_left->left;  //找到搜索二叉树的最左节点,就是链表的头节点
        Node* _right=root;
        while(_right&&_right->right)_right=_right->right; //找到搜索二叉树的最右节点,就是链表的尾节点
        //头节点的left指向尾节点,尾节点的right节点指向头节点
         _left->left=_right;
        _right->right=_left;
        return _left;
    }
};

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

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

相关文章

亚马逊品牌推荐金计划:通过亚马逊外营销活动赚取奖金!

亚马逊美国站发布公告称新推出的品牌推荐金计划可以让卖家在通过亚马逊外营销活动的销售中获得奖金,当卖家将非亚马逊营销流量引导至亚马逊时,您将获得促销产品以及客户在接下来的两周内购买的任何品牌产品平均销售额的10%的奖金,以下是公告内…

【C语言初阶】使用指针求字符串长度(五个版本盘点总结)

在代码的题目中,我们经常会遇到需要自己手写函数,求字符串长度的情况,那么今天博主就带大家一起盘点五种求字符串长度的写法 版本一:判断累加法 逻辑:由于字符串的末位是\0,且\0不计入字符串长度&#xf…

docker logs 使用说明

docker logs 可以查看某个容器内的日志情况。 前置参数说明 c_name容器名称 / 容器ID logs 获取容器的日志 , 命令如下: docker logs [options] c_name option参数: -n 查看最近多少条记录:docker logs -n 5 c_name--tail与-n 一样 &#…

C高级 作业 day2 8/3

1.脑图 2.递归实现&#xff0c;输入一个数&#xff0c;输出这个数的每一位 #include <myhead.h>void solute(int a) {if(a<10&&a>0) //如果是一位数{printf("%2d\t",a);return;}else //两位及以上{ solute(a/10);printf("%d\t",a%10…

1345:香甜的黄油(Dijkstra)---信息学奥赛一本通

【题目描述】 农夫John发现做出全威斯康辛州最甜的黄油的方法&#xff1a;糖。把糖放在一片牧场上&#xff0c;他知道N&#xff08;1≤N≤500&#xff09;只奶牛会过来舔它&#xff0c;这样就能做出能卖好价钱的超甜黄油。当然&#xff0c;他将付出额外的费用在奶牛上。 农夫Jo…

Electron 开发,报handshake failed; returned -1, SSL error code 1,错误

代码说明 在preload.js代码中&#xff0c;暴露参数给渲染线程renderer.js访问&#xff0c; renderer.js 报&#xff1a;ERROR:ssl_client_socket_impl.cc(978)] failed; returned -1, SSL error code 1,错误 问题原因 如题所说&#xff0c;跨进程传递消息&#xff0c;这意味…

Matlab对TMS320F28335编程--SVPWM配置互补PWM输出

前言 F28335中断 目的&#xff1a;FOC的核心算法及SVPWM输出&#xff0c;SVPWM的载波频率10kHz&#xff0c;SVPWM的每个周期都会触发ADC中断采集相电流&#xff0c;SVPWM为芯片ePWM4、5、6通道&#xff0c;配置死区 1、配置中断SVPWM进ADC中断&#xff0c;查上表知CPU1,PIE1 …

一个计算机专业的学生数据结构这门课学到什么程度才能算学的还不错?

数据结构之所以重要是因为它处于算法中的基础地位&#xff0c;与解决实际问题关系密切&#xff1b;而之所以不重要是因为课本上能学到的所有实现都已经有人造过轮子了&#xff0c;甚至已经作为很多语言的标准API存在了。 换句话来说&#xff0c;在以后的编码生涯中&#xff0c…

Qt tabwidget中插入widget

一、简单介绍 QT->tabWidget&#xff1a;标签页面。 在ui中通过工具栏自定义拉取控件&#xff0c;其中tabwidget可以可以创建多个标签页面&#xff0c;默认生成两个tab_widget(tab_1/tab_2)。并且可以在ui中右键自由添加控制删除等标签页&#xff0c;切换标签页就是切换widg…

TensorRT学习笔记--基于TensorRT部署YoloV3, YoloV5和YoloV8

目录 1--完整项目 2--模型转换 3--编译项目 4--序列化模型 5--推理测试 1--完整项目 以下以 YoloV8 为例进行图片和视频的推理&#xff0c;完整项目地址如下&#xff1a;https://github.com/liujf69/TensorRT-Demo git clone https://github.com/liujf69/TensorRT-Demo.…

Kubernetes高可用集群二进制部署(六)Kubernetes集群节点添加

Kubernetes概述 使用kubeadm快速部署一个k8s集群 Kubernetes高可用集群二进制部署&#xff08;一&#xff09;主机准备和负载均衡器安装 Kubernetes高可用集群二进制部署&#xff08;二&#xff09;ETCD集群部署 Kubernetes高可用集群二进制部署&#xff08;三&#xff09;部署…

8.3 C高级 Shell脚本

写一个脚本&#xff0c;包含以下内容&#xff1a; 显示/etc/group文件中第五行的内容创建目录/home/ubuntu/copy切换工作路径到此目录赋值/etc/shadow到此目录&#xff0c;并重命名为test将当前目录中test的所属用户改为root将test中其他用户的权限改为没有任何权限 #!/bin/b…

1016. 子串能表示从 1 到 N 数字的二进制串;2601. 质数减法运算;1824. 最少侧跳次数

1016. 子串能表示从 1 到 N 数字的二进制串 核心思想&#xff1a;第一种方法&#xff0c;直接将1-n转化为二进制数看它是否是在s中&#xff0c;第二种方法&#xff0c;将s的二进制字串转换为数字存在哈希表中&#xff0c;看它是否满足长度为n,然后具体的方法就是枚举字符串的左…

uC-OS2 V2.93 STM32L476 移植:串口打印篇

前言 前几篇已经 通过 STM32CubeMX 搭建了 NUCLEO-L476RG 的 STM32L476RG 的 裸机工程&#xff0c;下载了 uC-OS2 V2.93 的源码&#xff0c;并把 uC-OS2 的源文件加入 Keil MDK5 工程&#xff0c;通过适配 Systick 系统定时器与 PendSV 实现任务调度&#xff0c;初步让 uC-OS2 …

以技术驱动反欺诈,Riskified 为企业出海保驾护航

如今&#xff0c;全球对于线上消费的需求日益增长&#xff0c;各类新型支付方式也层出不穷。在国内&#xff0c;线上支付有着较为完善的法律及监管条例&#xff0c;格局基本已定型。但对于出海商家而言&#xff0c;由于不同国家和地区的支付规则和监管机制不同&#xff0c;跨境…

老师辅助神器:人工智能知道学生是否在集中注意力

面部识别技术于20世纪60年代引入&#xff0c;在人工智能寒冬中萎靡不振&#xff0c;近年来在日益强大的深度神经网络的推动下已经起飞。面部识别已应用于Face ID设备解锁功能&#xff0c;公共安全服务&#xff0c;智能支付系统等。在泰勒斯威夫特&#xff08;Taylor Swift&…

C高级第二讲

1、思维导图 2、递归实现&#xff0c;输入一个数&#xff0c;输出这个数的每一位 /* ---------------------------------author&#xff1a;YoungZorncreated on 2023/8/3 18:40.--------------------------------- */ #include<iostream>using namespace std;//递归实现…

s7200Smart

一、介绍 二、通讯 rs485 modbus通讯口

ansible配置文件案例

案例一 控制主机上的普通用户控制受控主机 控制端1台&#xff0c;受控端两台 1.将两台受控主机添加到/etc/hosts文件中 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhos…

时序预测 | Matlab实现基于BP神经网络的电力负荷预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 时序预测 | Matlab实现基于BP神经网络的电力负荷预测模型 BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。B