news 2026/2/8 20:15:24

二叉搜索树与双向链表

作者头像

张小明

前端开发工程师

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/2/8 17:58:27

Koodo Reader如何实现智能封面管理?电子书封面优化全攻略

Koodo Reader如何实现智能封面管理&#xff1f;电子书封面优化全攻略 【免费下载链接】koodo-reader A modern ebook manager and reader with sync and backup capacities for Windows, macOS, Linux and Web 项目地址: https://gitcode.com/GitHub_Trending/koo/koodo-read…

作者头像 李华
网站建设 2026/2/8 10:54:49

终极指南:如何在Android应用中快速集成Vosk中文语音识别功能

终极指南&#xff1a;如何在Android应用中快速集成Vosk中文语音识别功能 【免费下载链接】vosk-android-demo alphacep/vosk-android-demo: Vosk Android Demo 是一个演示项目&#xff0c;展示了如何在Android平台上使用Vosk语音识别引擎进行实时语音转文本功能。Vosk是开源的离…

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

文档生成PPT工具大集合,PDF与Word都能直接用

告别文档转PPT难题&#xff01;轻竹办公一键搞定 每到季度末&#xff0c;职场人总会陷入让人头大的汇报难题里。对着堆成山的 PDF、Word 文档&#xff0c;想把它们转换成 PPT&#xff0c;却发现内容框架混乱&#xff0c;不知道怎么提炼重点&#xff1b;好不容易搭好框架&#…

作者头像 李华
网站建设 2026/2/8 9:53:42

AI自动生成PPT工具对比分析,效率差距明显

职场年终总结痛点大揭秘 又到年终总结季&#xff0c;职场人仿佛进入了一场没有硝烟的战斗。熬夜赶报告是常有的事&#xff0c;框架搭建像在迷雾中摸索&#xff0c;脑中思绪万千&#xff0c;却不知从何下笔&#xff1b;设计排版更是让人头疼&#xff0c;满脑子商务风格&#xf…

作者头像 李华
网站建设 2026/2/6 17:29:35

PDF转Word格式容易乱?分享几种实用解决方法

折腾半天终于把PDF转成了Word&#xff0c;满心期待点开却发现全是乱码&#xff0c;是不是瞬间心态崩了&#xff1f;放心&#xff0c;很多人都踩过这个坑。想了解乱码产生的原因和应对方法吗&#xff1f;继续往下看~一、乱码的常见表现形式乱码类型表现形式可能原因排查方向方框…

作者头像 李华