news 2026/9/3 0:15:57

二叉搜索树与双向链表

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
二叉搜索树与双向链表

目录

基本要求

节点结构

核心算法:中序遍历 + 指针修改

算法思想

递归实现

非递归实现

复杂度分析

时间复杂度:

空间复杂度:


基本要求

这是一个经典的算法问题:将二叉搜索树(BST)转换成一个排序的双向循环链表(或双向链表)。

通常题目要求是:

  1. 双向链表中的节点顺序与二叉搜索树的中序遍历顺序一致(即升序)。
  2. 需要将节点的左右指针分别作为双向链表的前驱(prev)和后继(next)指针。
  3. 有时要求链表是循环的(头尾相连),有时只要求是双向链表。
  4. 原地转换:不能创建新节点,只能调整原有指针

节点结构

class Node { public: int val; Node* left; Node* right; Node(int _val) : val(_val), left(nullptr), right(nullptr) {} };

核心算法:中序遍历 + 指针修改

算法思想

利用BST(二叉搜索树)的中序遍历特性:

  1. 中序遍历BST会按升序访问所有节点
  2. 在遍历过程中,记录前一个访问的节点(prev)
  3. 将当前节点与prev节点双向连接
  4. 遍历完成后,连接头尾节点形成循环

递归实现

class Solution { private: Node* prev = nullptr; // 记录前驱节点 Node* head = nullptr; // 记录链表头节点 // 中序遍历递归函数 void inorderTraversal(Node* curr) { if (!curr) return; // 1. 递归遍历左子树 inorderTraversal(curr->left); // 2. 处理当前节点 if (!prev) { // 第一个节点(最小值),设为头节点 head = curr; } else { // 连接前驱和当前节点 prev->right = curr; curr->left = prev; } // 更新prev为当前节点 prev = curr; // 3. 递归遍历右子树 inorderTraversal(curr->right); } public: Node* treeToDoublyList(Node* root) { if (!root) return nullptr; // 中序遍历并调整指针 inorderTraversal(root); //如果需要转换BST为双向循环链表(不需要删除下面两行代码即可) // 连接头尾形成循环链表 head->left = prev; // 头的前驱指向尾 prev->right = head; // 尾的后继指向头 return head; } };

非递归实现

不使用递归,通过显式栈来模拟中序遍历的过程,在遍历过程中调整指针指向。

class Solution { public: Node* treeToDoublyList(Node* root) { if (!root) return nullptr; Node* prev = nullptr; Node* head = nullptr; stack<Node*> st; Node* curr = root; // 中序遍历(迭代版) while (curr || !st.empty()) { // 左子树入栈 while (curr) { st.push(curr); curr = curr->left; } // 弹出当前节点 curr = st.top(); st.pop(); // 连接节点 if (!prev) { head = curr; // 第一个节点 } else { prev->right = curr; curr->left = prev; } prev = curr; curr = curr->right; // 处理右子树 } //如果需要转换BST为双向循环链表(不需要删除下面两行代码即可) // 形成循环 head->left = prev; prev->right = head; return head; } };

复杂度分析

时间复杂度:

O(n):每个节点被访问一次,n为节点总数

空间复杂度:

O(h),h为树的高度

  • 最坏情况(链状树):O(n)
  • 最好情况(平衡树):O(log n)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 5:14:15

LobeChat安全性评估:数据隐私保护如何做到位?

LobeChat安全性评估&#xff1a;数据隐私保护如何做到位&#xff1f; 在企业越来越依赖人工智能处理敏感业务的今天&#xff0c;一个看似简单的问题却成了技术决策的关键瓶颈&#xff1a;我们能不能放心地让AI“看到”内部资料&#xff1f;尤其是当主流大模型服务要求将数据上传…

作者头像 李华
网站建设 2026/9/2 2:56:55

CSS 伪类 after 清除浮动:前端老手都在用的布局妙招

CSS 伪类 after 清除浮动&#xff1a;前端老手都在用的布局妙招 CSS 伪类 after 清除浮动&#xff1a;前端老手都在用的布局妙招引言&#xff1a;那些年我们一起追过的浮动为什么清除浮动这么让人头疼CSS 伪类 after 是什么神仙操作深入剖析 clearfix 技术背后的原理after 伪元…

作者头像 李华
网站建设 2026/9/2 17:14:54

EmotiVoice语音合成在心理咨询机器人中的应用潜力

EmotiVoice语音合成在心理咨询机器人中的应用潜力 在心理健康服务资源日益紧张的今天&#xff0c;越来越多的人面临情绪困扰却难以获得及时、私密的心理支持。传统的面对面咨询受限于专业人力和地理分布&#xff0c;而数字疗法正在成为重要补充。其中&#xff0c;心理咨询机器人…

作者头像 李华
网站建设 2026/9/2 16:04:49

从100到10万:OpenIM Server如何支撑元宇宙大规模实时通信

虚拟演唱会中10万人同时发送弹幕、元宇宙社交平台中上千个虚拟角色实时互动、跨终端设备无缝同步消息状态——这些场景正成为下一代互联网的标准配置。然而传统IM系统在支撑大规模实时通信时面临三大核心挑战&#xff1a;连接数瓶颈导致系统崩溃、消息延迟超过300ms影响用户体验…

作者头像 李华
网站建设 2026/9/2 4:02:37

免费开源屏幕录制神器:vokoscreenNG 2024终极指南

免费开源屏幕录制神器&#xff1a;vokoscreenNG 2024终极指南 【免费下载链接】vokoscreenNG vokoscreenNG is a powerful screencast creator in many languages to record the screen, an area or a window (Linux only). Recording of audio from multiple sources is suppo…

作者头像 李华
网站建设 2026/9/2 22:09:39

导轨水平安装中安装面不平的解决方法

水平安装微型导轨时&#xff0c;安装面不平整会导致导轨变形、运行卡滞甚至缩短寿命。如何通过科学检测与精准调整规避这一问题&#xff1f;选用精加工的基准面&#xff1a;安装微型导轨的机械基面必须经过高精度加工&#xff0c;如磨削或精铣&#xff0c;以确保其直线度、平面…

作者头像 李华