剑指 Offer(第2版)面试题 36:二叉搜索树与双向链表

剑指 Offer(第2版)面试题 36:二叉搜索树与双向链表

  • 剑指 Offer(第2版)面试题 36:二叉搜索树与双向链表
    • 解法1:中序遍历 - 递归
    • 解法2:中序遍历 - 迭代

剑指 Offer(第2版)面试题 36:二叉搜索树与双向链表

题目来源:49. 二叉搜索树与双向链表

解法1:中序遍历 - 递归

题目要求输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。还要求不能创建任何新的结点,只能调整树中结点指针的指向。

例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。

在这里插入图片描述

二叉搜索树(BST)具有这样的性质:其左子树上的节点的值都小于等于根节点的值,其右子树上的节点的值都大于等于根节点的值。

于是我们想到,中序遍历这个二叉搜索树。设置 pLastNodeInList 指针指向双向链表的末尾,指针 cur 指向当前处理的节点,先向 cur->left 递归下去, 将当前节点的 left 指向链表的队尾,队尾的 right 指向当前节点,然后当前节点变成新的队尾,即:

  1. cur->left = *pLastNodeInList。
  2. 若 *pLastNodeInList 不为空指针,则 (*pLastNodeInList)->right = cur。

最后向 cur->right 递归下去。

处理完成后,pLastNodeInList 指向双向链表的末尾,向左指针移动,直至双向链表的最左侧的节点,返回该节点。

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution
{
public:TreeNode *convert(TreeNode *root){if (root == nullptr)return nullptr;// pLastNodeInList 指向双向链表的尾节点TreeNode *pLastNodeInList = nullptr;inOrderConvertNode(root, &pLastNodeInList);// 找到双向链表的头节点TreeNode *listHead = pLastNodeInList;while (listHead && listHead->left)listHead = listHead->left;return listHead;}// 辅函数 - 中序遍历转换void inOrderConvertNode(TreeNode *p, TreeNode **pLastNodeInList){if (p == nullptr)return;TreeNode *cur = p;if (cur->left)inOrderConvertNode(cur->left, pLastNodeInList);cur->left = *pLastNodeInList;if (*pLastNodeInList)(*pLastNodeInList)->right = cur;*pLastNodeInList = cur;if (cur->right)inOrderConvertNode(cur->right, pLastNodeInList);}
};

复杂度分析:

时间复杂度:O(n),其中 n 是二叉搜索树的节点个数。每个节点都会遍历一次。

空间复杂度:O(depth),其中 depth 是二叉搜索树的深度。

解法2:中序遍历 - 迭代

代码:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution
{
public:static TreeNode *convert(TreeNode *root){TreeNode *head = nullptr, *prev = nullptr;stack<TreeNode *> stk;while (root || !stk.empty()){while (root){stk.push(root);root = root->left;}root = stk.top();stk.pop();if (head){prev->right = root;root->left = prev;}else{head = root;prev = root;}prev = root;root = root->right;}return head;}
};

复杂度分析:

时间复杂度:O(n),其中 n 是二叉搜索树的节点个数。

空间复杂度:O(n),其中 n 是二叉搜索树的节点个数。

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

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

相关文章

信息收集 - 域名

1、Whois查询: Whois 是一个用来查询域名是否已经被注册以及相关详细信息的数据库(如:域名所有人、域名注册商、域名注册日期和过期日期等)。通过访问 Whois 服务器,你可以查询域名的归属者联系方式和注册时间。 你可以在 域名Whois查询 - 站长之家 上进行在线查询。 2、…

【CMU 15-445】Lecture 12: Query Execution I 学习笔记

Query Execution I Processing ModelsIterator ModelMaterialization ModelVectorization Model Access MethodsSequential ScanIndex Scan Modification QueriesHalloween Problem 本节课主要介绍SQL语句执行的相关机制。 Processing Models 首先是处理模型&#xff0c;它定义…

基于JAVA+SpringBoot+Vue的前后端分离的学校请假管理系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 系统分为四个角色&…

机器学习 | 决策树 Decision Tree

—— 分而治之&#xff0c;逐个击破 把特征空间划分区域 每个区域拟合简单模型 分级分类决策 1、核心思想和原理 举例&#xff1a; 特征选择、节点分类、阈值确定 2、信息嫡 熵本身代表不确定性&#xff0c;是不确定性的一种度量。 熵越大&#xff0c;不确定性越高&#xff0c;…

MIT6.S081-实验准备

实验全程在Vmware虚拟机 (镜像&#xff1a;Ubuntu-20.04-beta-desktop-amd64) 中进行 一、版本控制 1.1 将mit的实验代码克隆到本地 git clone git://g.csail.mit.edu/xv6-labs-2020 1.2 修改本地git配置文件 创建github仓库&#xff0c;记录仓库地址 我的仓库地址就是htt…

C# 基本桌面编程(二)

一、前言 本章为C# 基本桌面编程技术的第二节也是最后一节。前一节在下面这个链接 C# 基本桌面编程&#xff08;一&#xff09;https://blog.csdn.net/qq_71897293/article/details/135024535?spm1001.2014.3001.5502 二、控件布局 1 叠放顺序 在WPF当中布局&#xff0c;通…

饥荒Mod 开发(十):制作一把AOE武器

饥荒Mod 开发(九)&#xff1a;物品栏排列 饥荒Mod 开发(十一)&#xff1a;修改物品堆叠 前面的文章介绍了很多基础知识以及如何制作一个物品&#xff0c;这次制作一把武器&#xff0c;装备之后可以用来攻击怪物。 制作武器贴图和动画 1.1 制作贴图。 先准备一张武器的贴图&a…

解决:AttributeError: module ‘scipy.misc’ has no attribute ‘imsave’

解决&#xff1a;AttributeError: module ‘scipy.misc’ has no attribute ‘imsave’ 文章目录 解决&#xff1a;AttributeError: module scipy.misc has no attribute imsave背景报错问题报错翻译报错位置代码报错原因解决方法方法一 scipy版本回退&#xff08;不推荐&#…

MySQL_13.InonDB表空间

InnoDB 表空间介绍以及管理 1.mysql表空间类型 system tablespace 系统表空间 file-per-table tablespace 独立表空间 temporary tablespace 临时表空间 undo tablespace UNDO表空间 general tablespace…

React中props 和 state异同初探

在 React 中&#xff0c;props 和 state 是两个非常重要的概念&#xff0c;它们决定了组件的行为和渲染方式。 Props props&#xff08;属性&#xff09;是父组件传递给子组件的数据。它们类似于函数的参数&#xff0c;可以在组件内部被访问和使用&#xff0c;但不能被修改。…

鸿蒙4.0核心技术-WebGL开发

场景介绍 WebGL主要帮助开发者在前端开发中完成图形图像的相关处理&#xff0c;比如绘制彩色图形等。 接口说明 表1 WebGL主要接口列表 接口名描述canvas.getContext获取canvas对象上下文。webgl.createBuffer(): WebGLBuffernullwebgl.bindBuffer(target: GLenum, buffer: …

饥荒Mod 开发(十三):木牌传送

饥荒Mod 开发(十二)&#xff1a;一键制作 饥荒Mod 开发(十四)&#xff1a;制作屏幕弹窗 一键传送源码 饥荒的地图很大&#xff0c;跑地图太耗费时间和饥饿值&#xff0c;如果大部分时间都在跑图真的是很无聊&#xff0c;所以需要有一个能够传送的功能&#xff0c;不仅可以快速…

Web前端-JavaScript(js表达式)

文章目录 JavaScript基础第01天1.编程语言概述1.1 编程1.2 计算机语言1.2.1 机器语言1.2.2 汇编语言1.2.3 高级语言 1.4 翻译器 2.计算机基础2.1 计算机组成2.2 数据存储2.3 数据存储单位2.4 程序运行 3.初始JavaScript3.1 JavaScript 是什么3.2 JavaScript的作用3.3 HTML/CSS/…

《点云处理》平面拟合

前言 在众多点云处理算法中&#xff0c;其中关于平面拟合的算法十分广泛。本篇内容主要是希望总结归纳各类点云平面拟合算法&#xff0c;并且将代码进行梳理保存。 环境&#xff1a; VS2019 PCL1.11.1 1.RANSAC 使用ransac对平面进行拟合是非常常见的用法&#xff0c;PCL…

医疗智能化革命:AI技术引领医疗领域的创新进程

一、“AI”医疗的崛起 随着人工智能&#xff08;AI&#xff09;技术的崛起&#xff0c;"AI"医疗正在以惊人的速度改变着医疗行业的面貌。AI作为一种强大的工具&#xff0c;正在为医疗领域带来前所未有的创新和突破。它不仅在医学影像诊断、病理学分析和基因组学研究等…

Linux ls命令教程:如何有效地列出文件和目录(附案例详解和注意事项)

Linux ls命令介绍 ls是Linux中的基本命令之一&#xff0c;任何Linux用户都应该知道。ls命令列出文件系统中的文件和目录&#xff0c;并显示有关它们的详细信息。它是所有Linux发行版都安装的GNU核心实用程序包的一部分。 Linux ls命令适用的Linux版本 ls命令在所有Linux发行…

vertx写sip服务器

Vert.x SIP 模块默认使用 TCP 协议进行通信。如果您需要支持 UDP 协议&#xff0c;您需要自定义 SIP 协议栈&#xff0c;并在其中实现 UDP 传输。 以下是一个示例代码&#xff0c;演示如何在 Vert.x 中创建一个支持 UDP 的 SIP 服务器&#xff1a; import io.vertx.core.net.…

设计模式——状态模式

引言 状态模式是一种行为设计模式&#xff0c; 让你能在一个对象的内部状态变化时改变其行为&#xff0c; 使其看上去就像改变了自身所属的类一样。 问题 状态模式与有限状态机 的概念紧密相关。 其主要思想是程序在任意时刻仅可处于几种有限的状态中。 在任何一个特定状态中…

手拉手EasyExcel极简实现web上传下载(全栈)

环境介绍 技术栈 springbootmybatis-plusmysqleasyexcel 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具。 他能让你在不用考虑性…

【shell脚本实战案例】sed替换文本中指定数据所在的行

目录 问题背景&#xff1a; 解决方法&#xff1a; 1.sed替换每行第一个出现的关键字 2.sed替换某一行出现的关键字 3.sed替换某一行第N次出现的关键字 4.sed替换文件中所有的关键字 5.sed将文件中所有关键字替换成空&#xff08;即关键字全部删除的另一种方式&#xff09…