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

news2024/11/26 5:20:07

剑指 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.coloradmin.cn/o/1319426.html

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

相关文章

智能电力监控管理系统在物业小区的应用——安科瑞 顾烊宇

0引言 由于部分住宅小区存在电力设施纸质档案破损缺失、产权分界不清、查找故障点所在箱变&#xff08;箱式变电站&#xff0c;下同&#xff09;位置困难或小区出入口路径不明等情况&#xff0c;影响了抢修效率。为此&#xff0c;国网辽宁沈阳市沈北新区供电公司依托原有GIS平台…

C/C++ STL提供的关联式容器之set

set&#xff08;集合&#xff09;顾名思义&#xff0c;就是数学上的集合 —— 每个元素最多只出现一次&#xff0c;并且 set 中的元素已经从小到大排好序。 特点 1. 使用红黑树实现&#xff0c;其内部元素依据其值自动排序&#xff0c;每个元素值只能出现一次&#xff0c;…

海思平台isp之raw图回灌调试

文章目录 一、搭建环境二、配置参数三、回灌raw图isp调试中,经常会遇到一些特定场景的效果需要优化,但由于某些原因和成本考虑,开发人员无法亲临现场,这个时候采集场景raw图回灌到板端调试,就显得尤为方便了。 一、搭建环境 (1)建立板端与PQTool连接 板端进入SS928V100…

【基础算法】前缀和

文章目录 算法介绍什么是前缀和&#xff1f;&#xff1f;前缀和的作用一维数组求解前缀和(Si)二维数组求解前缀项和 示例题目1&#xff1a;acwing795示例题目2&#xff1a;acwing796总结收获 算法介绍 什么是前缀和&#xff1f;&#xff1f; 数组: a[1], a[2], a[3], a[4], a[…

Nat Med | Tau靶向反义寡核苷酸

今天给同学们分享一篇实验文章“Tau-targeting antisense oligonucleotide MAPTRx in mild Alzheimers disease: a phase 1b, randomized, placebo-controlled trial”&#xff0c;这篇文章发表在Nat Med期刊上&#xff0c;影响因子为82.9。 结果解读&#xff1a; 患者 从201…

Kubernetes (k8s) 快速认知

应用部署方式 传统部署时代 早期的时候&#xff0c;各个组织是在物理服务器上运行应用程序。缺点 资源分配问题&#xff1a; 无法限制在物理服务器中运行的应用程序资源使用 维护成本问题&#xff1a; 部署多个物理机&#xff0c;维护许多物理服务器的成本很高 虚拟化部署时…

1265. 数星星(树状数组/蓝桥杯)

题目&#xff1a; 输入样例&#xff1a; 5 1 1 5 1 7 1 3 3 5 5输出样例&#xff1a; 1 2 1 1 0 思路&#xff1a; 树状数组 代码&#xff1a; #include<cstdio> #include<iostream> using namespace std; const int N32010; int n; int tr[N],level[N];int lo…

sap table 获取 valuation class MBEW 查表获取

参考 https://www.tcodesearch.com/sap-tables/search?qvaluationclass

【贪心算法】【中位贪心】LeetCode:100123.执行操作使频率分数最大

涉及知识点 双指针 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 贪心算法 题目 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 你可以对数组执行 至多 k 次操作&#xff1a; 从数组中选择一个下标 i &#xff0c;将 nums[i] …

springboot221酒店管理系统

springboot221酒店管理系统 源码获取&#xff1a; https://docs.qq.com/doc/DUXdsVlhIdVlsemdX

sql注入攻击的原理及注入攻击方式

SQL注入攻击是一种常见的网络安全威胁&#xff0c;它利用了Web应用程序中对SQL语句的不当处理。在SQL注入攻击中&#xff0c;攻击者通过将恶意SQL代码嵌入到应用程序预期的输入中&#xff0c;从而能够控制或欺骗后端数据库系统。这种攻击可以用来获取未授权的数据访问&#xff…

飞天使-docker知识点4-harbor

文章目录 Harbor安装完成harbor 官方建议方式之后查看 images配置docker 使用harbor 仓库上传下载镜像docker 镜像结合harbor 运行 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器&#xff0c;由 vmware 开源&#xff0c;其通过添加一些企业必需的功…

55 代码审计-JAVA项目注入上传搜索或插件挖掘

目录 必备知识点演示案例:简易Demo段SQL注入及预编译IDEA审计插件FindBugs安装使用Fortify_SCA代码自动审计神器使用Ofcms后台SQL注入-全局搜索关键字Ofcms后台任意文件上传-功能点测试 涉及资源&#xff1a; 我们一般针对java项目&#xff0c;进行漏洞分析的话&#xff0c;主要…

关于“Python”的核心知识点整理大全26

目录 10.3.9 决定报告哪些错误 10.4 存储数据 10.4.1 使用 json.dump()和 json.load() number_writer.py number_reader.py 10.4.2 保存和读取用户生成的数据 对于用户生成的数据&#xff0c;使用json保存它们大有裨益&#xff0c;因为如果不以某种方式进行存储&#xf…

LeetCode - 460 LFU缓存(Java JS Python)

题目来源 460. LFU 缓存 - 力扣&#xff08;LeetCode&#xff09; 题目描述 请你为 最不经常使用&#xff08;LFU&#xff09;缓存算法设计并实现数据结构。 实现 LFUCache 类&#xff1a; LFUCache(int capacity) - 用数据结构的容量 capacity 初始化对象int get(int key)…

[软件] Beyond Compare4

界面简介 文件夹比较, 文本比较, 合并等非常有用的软件, 尤其是在对比代码上面, 有时候很难找到自己的代码和别人的代码到底哪里出现了区别, 这个软件就非常有效了.

智能制造网络:连接未来制造业

数字化在制造业中已经成为国家战略和行业升级的显著趋势。其影响不仅深刻地触及到个人生活&#xff0c;也在国家层面产生了重大影响&#xff0c;涉及经济、国防和军事等多个领域。在制造业数字化转型的进程中&#xff0c;构建坚实的基础网络被视为确保数字化生产全过程顺畅运作…

什么胶能粘PP塑料?

在日常生活中或实际制造业中&#xff0c;会遇到需要将PP塑料&#xff08;聚丙烯&#xff09;与其他物质粘合的情况&#xff0c;我们会选择使用胶水来粘合。那么&#xff0c;究竟什么样的胶水能更好的粘合PP塑料呢&#xff1f; PP塑料是一种非极性材料&#xff0c;表面通常比较…

【兔子王赠书第12期】赠ChatGPT中文范例的自然语言处理入门书

文章目录 写在前面自然语言处理图书推荐图书简介编辑推荐 推荐理由粉丝福利写在后面 写在前面 小伙伴们好久不见吖&#xff0c;本期博主给大家推荐一本入门自然语言处理的经典图书&#xff0c;一起来看看吧~ 自然语言处理 自然语言处理&#xff08;Natural Language Process…

Linux---远程登录、远程拷贝命令

1. 远程登录、远程拷贝命令的介绍 命令说明ssh远程登录scp远程拷贝 2. ssh命令的使用 ssh是专门为远程登录提供的一个安全性协议&#xff0c;常用于远程登录&#xff0c;想要使用ssh服务&#xff0c;需要安装相应的服务端和客户端软件&#xff0c;当软件安装成功以后就可以使…