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

news2024/11/11 19:23:56

题目描述

将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。

对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。

特别地,我们希望可以 就地 完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中最小元素的指针。

示例 1:

输入:root = [4,2,5,1,3] 

输出:[1,2,3,4,5]

解释:下图显示了转化后的二叉搜索树,实线表示后继关系,虚线表示前驱关系。

示例 2:

输入:root = [2,1,3]
输出:[1,2,3]

示例 3:

输入:root = []
输出:[]
解释:输入是空树,所以输出也是空链表。

示例 4:

输入:root = [1]
输出:[1]

提示:

  • -1000 <= Node.val <= 1000
  • Node.left.val < Node.val < Node.right.val
  • Node.val 的所有值都是独一无二的
  • 0 <= Number of Nodes <= 2000

 

解题思路

我们可以通过递归的方法来解决这个问题。主要思想是:

  1. 递归处理左子树,将其转换为一个双向链表。
  2. 将当前节点与左子树的链表连接。
  3. 递归处理右子树,将其转换为一个双向链表。
  4. 将当前节点与右子树的链表连接。
  5. 最终将整个链表首尾相连。

具体步骤如下:

  1. 递归处理左子树

    • 如果 root 存在左子树,递归调用 TreeToDoublyList 函数将左子树转换为一个双向链表,并获取该链表的头节点和尾节点。
    • 将左子树链表的尾节点与当前 root 节点连接:左子树的尾节点的右指针指向 rootroot 的左指针指向左子树的尾节点。
  2. 递归处理右子树

    • 如果 root 存在右子树,递归调用 TreeToDoublyList 函数将右子树转换为一个双向链表,并获取该链表的头节点和尾节点。
    • 将右子树链表的头节点与当前 root 节点连接:右子树的头节点的左指针指向 rootroot 的右指针指向右子树的头节点。
  3. 将链表首尾相连

    • 将整个链表的头节点的左指针指向链表的尾节点,将尾节点的右指针指向链表的头节点,从而形成一个循环双向链表。
  4. 返回结果

    • 递归处理完所有节点后,返回形成的双向链表的头节点。
/*
// 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:
    pair<Node*, Node*> TreeToDoublyList(Node *root) {
        Node *leftHead = root, *leftTail = NULL, *rightHead = NULL, *rightTail = root;
        if (root->left) {
            tie(leftHead, leftTail) = TreeToDoublyList(root->left);
            leftTail->right = root;
            root->left = leftTail;
        }
        if (root->right) {
            tie(rightHead, rightTail) = TreeToDoublyList(root->right);
            rightHead->left = root;
            root->right = rightHead;
        }
        leftHead->left = rightTail;
        rightTail->right = leftHead;
        return {leftHead, rightTail};
    }

    Node* treeToDoublyList(Node* root) {
        return root ? TreeToDoublyList(root).first : NULL;
    }
};

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

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

相关文章

shell了解和问答机制

GUI&#xff08;图形用户界面&#xff09; 定义与特点&#xff1a; GUI全称为Graphical User Interface&#xff0c;即图形用户界面。 它是一种采用图形方式显示的计算机操作用户界面&#xff0c;允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项&#xff0c;以选择命令…

海康二次开发学习笔记12-从Group外部输入图像

从Group外部输入图像 用OpenCV从本地读图 当Group内部无图像源模块时,可以通过代码的方式将图片传入Group内部.实现方式有多种,可以使用OpenCV从本地读图,可在程序集搜索引用OpenCvSharp&#xff0c;同时将其复制本地的属性改为False. 1. 界面设计 增加加载图像按钮 2. 处理…

【学习笔记】卫星通信NTN 3GPP标准化进展分析(二)- 3GPP Release16 内容

一、引言&#xff1a; 本文来自3GPP Joern Krause, 3GPP MCC (May 14,2024) Non-Terrestrial Networks (NTN) (3gpp.org) 本文总结了NTN标准化进程以及后续的研究计划&#xff0c;是学习NTN协议的入门。 【学习笔记】卫星通信NTN 3GPP标准化进展分析&#xff08;一&#xff…

学习Kerberos

学习Kerberos Kerberos的 是一种分布式、基于票证的身份验证服务&#xff0c;因为基于分布式&#xff0c;可能这种类型的协议我们平时接触比较少&#xff0c;Web端一般都是通过Cookie、Token、Oauth、Password等各种协议认证&#xff0c;客户端通过Ssh、Password等认证方式&am…

WAF的功能、检测、指纹及绕过

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330&scene21#wechat_redirect 《网安面试指南》…

尝试用java spring boot+VUE3实现前后端分离部署

前言 这几天开学了&#xff0c;公司这边几个和学校对接的项目都挺忙的&#xff0c;然后我又开始有点闲的情况了。问大佬能不能继续看看若依的项目&#xff0c;大佬让我自己去学了。在看若依的项目的时候在想&#xff0c;python的FLASK后端实现和JAVA spring boot的实现差别大不…

Redis与SpringMVC的整合与最佳实践

整合Redis与Spring MVC&#xff08;现在通常是Spring Boot的一部分&#xff09;可以提高应用性能&#xff0c;特别是在处理大量数据缓存和会话状态管理方面。 下面是一些关于如何整合Redis与Spring MVC的最佳实践&#xff1a; 1. 引入依赖 首先&#xff0c;你需要在你的项目中…

Linux之grafana+onealert报警

grafana介绍 Grafana是一个开源的度量分析和可视化工具&#xff0c;可以通过将采集的数据分析&#xff0c;查询&#xff0c;然后进行可视化的展示,并能实现报警。 grafana安装与登录 在grafana服务器上安装grafana 下载地址&#xff1a;https://grafana.com/grafana/downloa…

包装类及常量池

1、基本数据类型byte、short、int、long、char、boolean的包装类用到了常量池&#xff0c;大小在127以内的从常量池获取&#xff1b; 2、基本数据类型中float、double没有实现常量池技术&#xff1b; 3、java中字符串实现常量池技术&#xff1b; public class Test {public …

电机设计及电机仿真“新工具”—仿真APP

电机仿真APP可以广泛应用于电机设计、制造、测试和维护领域&#xff0c;具有强大的计算能力&#xff0c;能够模拟电机的各种工作状态和参数变化。用户可通过调整仿真参数&#xff0c;快速得到电机的响应和性能参数&#xff0c;从而进行针对性的优化和改进。借助仿真APP&#xf…

动态规划法例题

第一个空&#xff0c;用手工计算&#xff0c;可以用贪心法 先选择价值最大的物品&#xff0c;有两个价值是6的物品&#xff0c;重量合计246 剩余4个空间&#xff0c;只能放重量为2的物品&#xff0c;一共是66315 第二个空&#xff0c;需要将所有物品都放进背包舱室&#xff…

黄力医生:血压高降不下来找准这三个方向真的降下来了

在心脑血管疾病的诊疗中&#xff0c;高血压作为一种常见的慢性病&#xff0c;其管理和控制对于预防心脑血管疾病的发生和发展至关重要。然而&#xff0c;许多患者面临血压居高不下、难以控制的困境。今天&#xff0c;我们有幸邀请到心脑血管科专家黄力医生&#xff0c;为大家深…

React中实现antd自定义图标,鼠标悬浮变色

借助 antd 的 tooltip 组件来实现 hover 时变色的效果 1.新建组件 自定义图标一般在iconfont上面获取&#xff0c;复制下来的svg代码&#xff0c;切记要删除 fill 属性后添加到组件中 import { Tooltip } from "antd"; import React from "react";const …

【JavaWeb】Cookie、Session

文章目录 Cookie、Session一、Cookie&#xff08;客户端&#xff09;1、Cookie 的 特点2、Cookie 的 工作原理3、Cookie 的 基本操作5、Cookie 的 域名与路径6、Cookie 的 存活时间7、Cookie 的 删除 二、Session&#xff08;服务端&#xff09;1、Session 的 特点2、Session 的…

Mysql性能优化之自适应索引

自适应索引 是什么 自适应哈希索引是 InnoDB 存储引擎为了提高特定类型查询性能而自动构建的一种内存中的哈希索引结构。它可以根据查询模式和数据访问频率自动调整&#xff0c;以优化数据库的性能。 与BTree的区别 与传统的 B-tree 索引不同&#xff0c;哈希索引使用哈希函…

基于Java的旅游服务管理系统的设计与实现(论文+源码)_kaic

摘 要 伴随着人们生活水平的提高&#xff0c;服务行业也得到了飞速发展。人们对旅游活动也越来越重视。很多旅游爱好者以及生活压力过大的人都会选择周末&#xff0c;节假日或自己休闲时外出旅游&#xff0c;换种环境来放松心情&#xff0c;缓解工作压力&#xff0c;尽享别样生…

GHA文章是AI文章吗?

对于想做外贸的客户来说&#xff0c;谷歌SEO成为了每个网站的必攻课题&#xff0c;而在SEO策略中&#xff0c;内容质量至关重要&#xff0c;而现在&#xff0c;ai产业的发达也让不少人看见出海的希望&#xff0c;因为内容可以让ai生成&#xff0c;那么&#xff0c;现在火爆seo圈…

Leetcode199二叉树的右视图(java实现)

今天我们分享的题目是199题&#xff0c;题目描述如下&#xff1a; 那么本道题的解题思路呢就是使用层序遍历&#xff0c;每次将每层中的最后一个元素加入到我们的集合中。 本道题目和之前的层序遍历二叉树的题目很像&#xff0c;但是需要注意的细节。那么我会在代码中指出。 代…

JSON处理库 -- Fastjson

文章目录 一、json格式1.1 用途1.2 语法1.3 常见格式 二、fastjson常用类2.1 JSONObject2.2 JSONArray 三、序列化和反序列化3.1 默认序列化与反序列化3.2 序列化的扩展3.3 自定义序列化SerializeFilter3.4 JSONField 注解3.5 复习Jackson 一、json格式 1.1 用途 一种轻量级的…

SpringBoot3集成Spring Authorization Server和Spring Cloud Gateway实现网关统一认证

1. 概述 在微服务开发过程中&#xff0c;通常都会使用Spring Cloud Gateway构建统一的API网关&#xff0c;在访问微服务之前都会先校验访问者是否有权限访问资源&#xff0c;实现方式有很多&#xff0c;这里主要介绍Spring Cloud Gateway集成OAuth2.1如何实现网关统一认证。 S…