二叉树深度学习——将二叉搜索树转化为排序的双向链表

news2024/10/4 2:48:25

1.题目解析

题目来源:LCR 155.将二叉搜索树转化为排序的双向链表

测试用例

2.算法原理

首先题目要求原地进行修改并且要求左指针代表前驱指针,右指针代表后继指针,所以思路就是

1.使用前序遍历创建两个指针cur、prev代表当前节点与前一个节点,然后将前一个节点的后继指向当前节点,当前节点的前驱指向上一个节点即可,需要注意的是第一次不能访问前一个节点,因为前一个节点一开始为空,避免对空指针进行操作

2.然后通过创建一个节点head = root,此时root这棵树已经前序遍历完成,使用不断地head =head->left最终访问到root这棵树的最小节点,然后将最小节点的前驱指向最大节点,最大节点的后继指向最小节点,完成循环链表的操作

3.实战代码

/*
// 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:
    void InOrder(Node* cur,Node*& prev)
    {
        if(cur == nullptr)
        {
            return;
        }

        InOrder(cur->left,prev);
        
        //创建两个指针,不断中序遍历修改指针
        cur->left = prev;
        //第一次的prev为空,避免对空指针进行访问
        if(prev)
        {
            prev->right = cur;
        }

        //更新后继续中序遍历
        prev = cur;

        InOrder(cur->right,prev);
    }
    Node* treeToDoublyList(Node* root) 
    {
        if(root == nullptr)
        {
            return nullptr;
        }

        Node* prev = nullptr;
        InOrder(root,prev);

        //通过不断向左递归找到最小的节点
        Node* head = root;
        while(head->left)
        {
            head = head->left;
        }

        //将最左边的节点的前驱指向最右边节点
        //最右边节点的后继指向最左边节点
        head->left = prev;
        prev->right = head;

        return head;
    }
};

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

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

相关文章

STM32三种启动模式:【详细讲解】

STM32在上电后,从那里启动是由BOOT0和BOOT1引脚的电平决定的,如下表: BOOT模式选引脚启动模式BOOT0BOOT1X0主Flash启动01系统存储器启动11内置SRAM启动 BOOT 引脚的值在重置后 SYSCLK 的第四个上升沿时被锁定。在重置后,由用户决定是如何设…

硬件开发笔记(三十):TPS54331电源设计(三):设计好的原理图转设计PCB布板,12V输入电路布局设计

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/142694484 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…

挖矿病毒记录 WinRing0x64.sys

之前下载过福晰pdf编辑器,使用正常。 某天发现机器启动后,过个几分钟(具体为5min)会自动运行几个 cmd 脚本(一闪而过),但是打开任务管理器没有发现异常程序(后面发现病毒程序伪装成System系统程序,见下图)…

Ascend C算子加速:优化与创新

Ascend C算子加速:优化与创新 随着大模型的迅速发展和人工智能计算需求的剧增,优化硬件性能变得尤为重要。针对这一需求,昇腾推出了Ascend Operator Library(AOL)算子加速库,专注于为开发者提供高效的算子…

C++-vector模拟实现

###vector底层相当于是数组,查看源码可以发现,这个类的私有成员变量是三个迭代器;在实现时迭代器就可以当作是vector里面的元素的指针类型; ###vector是一个类模板,实现时也应当按照这样的写法用一个模板去实现&#…

某项目实战代码(一)

1.下载安装并配置环境变量openssl,可自行在网上寻找。 2.在项目中导入opensll中的“包含(include)”和“库(lib)” 3.选择debug x86平台,不然会报错。 4.运行结果如下。可自行比对 md5 value: 33b3bc8e05b4fcc16bd531dd9adac166 5.代码如下 #define…

基于STM32的智能家居灯光控制系统设计

引言 本项目将使用STM32微控制器实现一个智能家居灯光控制系统,能够通过按键、遥控器或无线模块远程控制家庭照明。该项目展示了如何结合STM32的外设功能,实现对灯光的智能化控制,提升家居生活的便利性和节能效果。 环境准备 1. 硬件设备 …

unix中的exec族函数介绍

一、前言 本文将介绍unix中exec族函数,包括其作用以及使用方法。当一个进程调用fork函数创建一个新进程后,新进程可以直接执行原本正文段的其他内容,但更多时候,我们在一个进程中调用fork创建新的进程后,希望新进程能…

在pycharm中设置后直接运行js代码

环境: pycharm专业版2020.3.2 已经安装nodejs和npm,并已经加入环境变量。 nodejs的安装参考在pycharm中运行js文件以及附加node.js下载步骤_python_脚本之家 下面开始在pycharm中设置,让其可以直接运行js代码,即需要安装一个叫…

C# 字符与字符串

本课要点: 1、字符类Char的使用 2、字符串类String的使用 3、可变字符串****StringBuilder 4、常见错误 一 何时用到字符与字符串 问题: 输出C#**课考试最高分:**98.5 输出最高分学生姓名:张三 输出最高分学生性别&#x…

六.应用层

目录 ​编辑 4.11 DHCP 6.1应用层的概述 6.2网络应用模型 CS P2P 6.3DNS 域名 www是什么,http是什么,到底什么区别? DNS出现及演化 DNS概括 DNS域名解析过程 6.4FTP FTP客户/服务器 FTP工作原理 FTP传输模式 6.5电子邮件 电…

King of Range 2024牛客国庆集训派对day3

原题 King of Range 解析 m 的值不大, 每次时间在 n logn 以内即可 我们遍历整个数组, 以 i 为右边界, 检测是否有满足条件的左边界, 一次只加上左面的所有可能, 用两个双向队列维护两个单调栈, 一个存最大值, 一个存最小值, 这样可以帮助找到合适的左边界 代码 #include …

JAVA并发编程系列(13)Future、FutureTask异步小王子

美团本地生活面试:模拟外卖订单处理,客户支付提交订单后,查询订单详情,后台需要查询店铺备餐进度、以及外卖员目前位置信息后再返回。 时间好快,一转眼不到一个月时间,已经完成分享synchronized、volatile、…

Linux应用——简易日志

1. 日志要求 对于一个日志来说,我们任认为其应该具有以下的内容 1. 日志时间 2. 日志等级 3. 日志内容 4. 文件名称与行号 在此基础上我们对不同的日志做出分级,即 info: 常规信息 warning: 报警信号 error: 严重信号,可能需要立…

UNIAPP 动态菜单实现方法

1. 封装tabbar组件,组件UI使用uview的tabbar allList 定义出全部的菜单 list 定义当前用户能看到的菜单使用 u-tabbar 渲染出来 list 2. 权限判断处理 3. 使用方式 在 tab 页,底部放入该 tab 组件,并设置当前回显的页面,这里使用…

STM32F407寄存器操作(DMA+I2C)

1.前言 因为后面需要用到大量基础通讯传输的问题,于是今天折腾了一下DMA传输I2C与SPI的效果,其实我先是把DMASPI搞出来了。但是考虑到网上对于STM32的I2C微词颇多,基础的协议都没有调试出来,更遑论DMA控制了,前面调不…

排序算法之——归并排序,计数排序

文章目录 前言一、归并排序1. 归并排序的思想2. 归并排序时间复杂度及空间复杂度3. 归并排序代码实现1)递归版本2)非递归版本 二、计数排序1. 计数排序的思想2. 计数排序的时间复杂度及空间复杂度3. 计数排序代码实现 总结(排序算法稳定性&am…

计算机毕业设计 基于Python的无人超市管理系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

深度学习基础—残差网络ResNets

1.残差网络结构 当网络训练的很深很深的时候,效果是否会很好?在这篇论文中,作者给出了答案:Deep Residual Learning for Image Recognitionhttps://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/He_Deep_Residual_…

使用html写一个能发起请求的登录界面

目录 head部分 内联样式部分 body部分 login-form类的div myModal类的div id script部分 总的代码 界面与操作演示 <!DOCTYPE html> <html lang"en"> <!DOCTYPE html> 这是文档类型声明&#xff0c;告诉浏览器这是一个 HTML文档。 <…