算法的学习笔记—二叉搜索树与双向链表(牛客JZ36)

news2024/9/25 11:16:49

img

😀前言
在数据结构的学习过程中,二叉搜索树(Binary Search Tree, BST)是一个常见的主题。它不仅具有排序的特性,还为各类算法的实现提供了基础。然而,在某些特定的应用场景中,我们可能需要将二叉搜索树转换为其他形式的数据结构,如双向链表。本文将详细探讨如何将一棵二叉搜索树转换为排序的双向链表,并通过代码实现这一过程。

🏠个人主页:尘觉主页

文章目录

  • 😀二叉搜索树与双向链表
    • ❤️‍🔥问题描述
    • 😘示例
      • 输入描述:
      • 返回值描述:
      • 示例1
      • 示例2
    • 🤔解题思路
    • 🥰代码实现
      • 😁代码分析
      • 时间与空间复杂度
    • 😄总结

😀二叉搜索树与双向链表

NowCoder

❤️‍🔥问题描述

给定一棵二叉搜索树,需要将其转换成一个排序的双向链表。双向链表要求如下:

  • 每个节点的左指针指向前驱节点,右指针指向后继节点。
  • 转换过程中不得创建新的节点,只能调整已有节点的指针。
  • 转换后的双向链表中的节点按升序排列,并且返回链表中的第一个节点。

例如,给定的二叉搜索树为:

img

数据范围:输入二叉树的节点数 0≤n≤1000,二叉树中每个节点的值 0≤val≤1000

要求:空间复杂度O(1)(即在原树上操作),时间复杂度 O(n)

😘示例

输入描述:

二叉树的根节点

返回值描述:

双向链表的其中一个头节点。

示例1

输入:{10,6,14,4,8,12,16}

返回值:From left to right are:4,6,8,10,12,14,16;From right to left are:16,14,12,10,8,6,4;

说明:输入题面图中二叉树,输出的时候将双向链表的头节点返回即可。

示例2

输入:{5,4,#,3,#,2,#,1}

返回值:From left to right are:1,2,3,4,5;From right to left are:5,4,3,2,1;

说明:

                    5
                  /
                4
              /
            3
          /
        2
      /
    1
树的形状如上图       

🤔解题思路

将二叉搜索树转换为双向链表的关键在于对树进行中序遍历。中序遍历会按照从小到大的顺序访问树的每个节点,因此可以利用这一特性来构建排序的双向链表。

转换过程的核心步骤如下:

  1. 中序遍历: 采用递归的方式,对每个节点进行中序遍历。首先处理左子树,再处理当前节点,最后处理右子树。
  2. 指针调整: 在遍历过程中,调整当前节点与前一个节点之间的指针关系,使其形成双向链表。
  3. 记录链表头节点: 中序遍历的第一个节点即为双向链表的头节点。

🥰代码实现

以下是用 Java 实现该算法的代码:

private TreeNode pre = null;
private TreeNode head = null;

public TreeNode Convert(TreeNode root) {
    inOrder(root);
    return head;
}

private void inOrder(TreeNode node) {
    if (node == null)
        return;
    
    // 递归遍历左子树
    inOrder(node.left);
    
    // 处理当前节点的前驱与后继关系
    node.left = pre;
    if (pre != null)
        pre.right = node;
    pre = node;
    
    // 记录双向链表的头节点
    if (head == null)
        head = node;
    
    // 递归遍历右子树
    inOrder(node.right);
}

😁代码分析

  1. 中序遍历: inOrder 函数实现了二叉树的中序遍历。通过递归的方式,首先处理左子树,再处理当前节点,最后处理右子树。
  2. 指针调整: 对于每个被访问的节点,先将其左指针指向前一个访问的节点 pre。如果前一个节点存在,则将其右指针指向当前节点。最后,将 pre 更新为当前节点。
  3. 头节点记录:headnull 时,意味着当前节点是中序遍历的第一个节点,因此将其记录为双向链表的头节点。

时间与空间复杂度

  • 时间复杂度: O(n),其中 n 为二叉树的节点数。因为我们需要遍历每个节点一次。
  • 空间复杂度: O(1),因为转换是在原树上操作,没有使用额外的存储空间。

😄总结

通过本文的介绍,我们了解了如何将二叉搜索树转换为排序的双向链表。这一过程充分利用了中序遍历的特点,既保留了树中节点的有序性,又通过指针的调整将其转换为双向链表。这一算法不仅简洁高效,还能在实际开发中为各种应用场景提供有效的解决方案。

通过代码的实现,我们可以更直观地理解这一转换过程,并掌握在不同数据结构之间进行转换的技巧。这些知识将在日后的算法学习和实践中发挥重要作用。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

img

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

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

相关文章

Web安全:SQL注入实战测试.(扫描 + 测试)

Web安全:SQL注入实战测试. SQL注入就是 有些恶意用户在提交查询请求的过程中 将SQL语句插入到请求内容中,同时程序的本身对用户输入的内容过于相信,没有对用户插入的SQL语句进行任何的过滤,从而直接被SQL语句直接被服务端执行&am…

Docker绑定挂载使用手册

目录 目标 官方文档 绑定挂挂载(Bind mounts) 简介 基本创建方法 控制读写权限(默认有读写权限) 为什么绑定挂载不适合做数据库持久化 为什么绑定挂载更适合做热部署 临时挂载(tmpfs mounts) 简介…

CSS中的元素布局与定位详细说明

1、前言 在CSS开发中,很重要的一个工作就是根据UI设计稿,进行元素的布局与定位,使得元素(比如某一段文本、按钮、图片等)显示在页面正确的位置。本文就元素的布局与定位方面,做一些讲解和说明。 2、元素的…

PHP易支付系统,支付系统源码下载,已测试,带多个支付接口

易支付系统源码,已测试,功能齐全,带有多支付接口,站内有对应的视频教程,详细教程 搭建出来的网站前端和后台还是比较美观的 PHP全开源易支付系统源码,一键安装版 搭建环境:PHP 5.4 以上 推荐7…

数学基础(九)

一、相关分析 相关分析: 衡量事物之间或称变量之间线性相关的强弱,并适当的统计指标表示出来的过程 相关系数: 连续变量的相关分析: 连续变量即数据变量,它的取值之间可以比较大小,可以用加减法计算出差…

Google Colab快速使用

Google Colab快速使用 1. 引言2. Jupyter笔记本的创建3. 上传代码和数据集4. Colab常规指令 1. 引言 Google Colab是谷歌提供的免费Jupyter,很类似于Linux系统这些在终端界面操纵的感觉,不需要深度学习环境配置就可以使用,完全基于云端运行。…

【celery-2】python-Django发送邮件-短信-钉钉通知

一 Python发送邮件 1.1 使用SMTP模块发送邮件 import smtplib from email.mime.text import MIMEText from email.header import Headermsg_from xxxqq.com # 发送方邮箱 passwd xxx # 填入发送方邮箱的授权码(填入自己的授权码,相当于邮箱密码) msg_to [xxx…

两种方式实现图片标记

效果图 第一种&#xff1a;通过动态添加dom元素实现标记 代码如下 // index.tsx import React from "react"; import "./index.less";export default function index() {const parentRef React.useRef<any>(null);const ulRef React.useRef<a…

网站技术分析必备插件Wappalyzer Chrome介绍

引言 在日常的开发过程中&#xff0c;开发者们经常会对访问的某些网站使用了哪些技术感到好奇。无论是网页的前端框架、后台的编程语言&#xff0c;还是数据库的类型&#xff0c;这些信息对于开发者优化自己的网站或者了解行业趋势都非常有用。然而&#xff0c;直接从浏览器获…

LLM开发之自动编码系统实战开发(一)-- MiniRBAC 集成

文章目录 前言&#x1f387;MiniRBAC部署启动日志修改更换Mysql创建数据库数据库连接修改查询 Next ✨ 前言&#x1f387; 首先这个系统呢&#xff0c;俺们目前是还没有做好的&#xff0c;但是相关的技术积累我们是完全没有问题的。当然这个系统其实将是我们这个项目&#xff…

Android 消息机制Handler完全解析(一)

提到Handler相信即使你是刚入行的android开发也会用过&#xff0c;可能你会觉得很简单&#xff0c;但是Handler中包含的内容真的不是你理解的那么简单&#xff0c;可能有些工作3-5年的同学也没有对其有很深入的了解。但Handler在android中的地位非常重要&#xff0c;并且几乎是…

图解Kafka | 5张图讲透Kafka 消费者交付语义

Kafka 消费者交付语义指的是 Kafka 消费者在处理消息时如何保证消息的可靠性和一致性。这涉及到消息是否被丢失、重复处理或者按顺序消费。 Kafka消费者交付语义有三种&#xff0c;即&#xff1a; 最多一次至少一次精确一次 当消费者组/消费者从 Kafka 消费数据时&#xff0…

昂科烧录器支持Airoha达发科技的蓝牙音频芯片AB1568

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表&#xff0c;其中Airoha达发科技的蓝牙音频芯片AB1568已经被昂科的通用烧录平台AP8000所支持。 AB1568是一款获得蓝牙5.3和LE音频认证的单芯片解决方案&#xff0c;包含一个ARM Cortex-M4F应用…

香蕉梨:自然的甜蜜宝藏

在水果的缤纷世界里&#xff0c;有一种独特的存在&#xff0c;它融合了香蕉的软糯与梨子的清甜&#xff0c;那便是令人惊艳的香蕉梨。 食家巷香蕉梨&#xff0c;外形圆润可爱&#xff0c;色泽金黄中带着一抹清新的嫩绿&#xff0c;宛如大自然精心雕琢的艺术品。当你拿起一个香蕉…

使用Java进行中小学违规教育培训数据采集实践-以某城市为例

目录 前言 一、违规教育信息 1、内容管理 2、转换后的内容 二、数据库设计 1、空间数据库 三、字符地址位置转换空间信息 1、实现时序图 2、后台实体类的设计与实现 3、数据持久化操作 四、总结 前言 时间来到2024年8月24日&#xff0c;时间过得很快&#xff0c;2024…

PowerShell | git log 中文乱码问题解决

总结一下: 乱码核心问题就是对不上编码.改成对应编码即可. 明白‌LESSCHARSET环境变量‌是用来设置less命令的字符集编码的。当在命令行中使用less命令查看文件时&#xff0c;如果文件包含非ASCII字符&#xff08;如中文&#xff09;&#xff0c;可能会出现乱码问题。通过设置…

SpringBoot+Vue实现大文件上传(断点续传-前端控制)

SpringBootVue实现大文件上传&#xff08;断点续传&#xff09; 1 环境 SpringBoot 3.2.1&#xff0c;Vue 2&#xff0c;ElementUI 2 问题 在前一篇文章&#xff0c;我们写了分片上传来实现大文件上传&#xff0c;存在一个问题就是&#xff0c;中间失败的话需要重新上传&#…

QT WIN11 FluentUI APP开发

代码 import QtQuick import QtQuick.Controls import FluentUIItem {property bool autoPlay: trueproperty int loopTime: 2000property var modelproperty Component delegateproperty bool showIndicator: trueproperty int indicatorGravity : Qt.AlignBottom | Qt.Align…

【MySQL】一文带你理清<行级锁>(行锁,间隙锁,临键锁)

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

STM32(六):定时器——输出比较实验

PWM驱动呼吸灯 源码&#xff1a; #include "stm32f10x.h" // Device headervoid PWM_Init(void) {RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启时钟TIM_InternalClockConfig(TIM2);//选择时基单元的时钟TIM_TimeBaseInitTypeDef TI…