news 2026/6/23 7:54:41

二叉搜索树与双向链表

作者头像

张小明

前端开发工程师

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/6/23 17:48:27

暗黑破坏神2存档编辑器终极指南:从零基础到精通进阶

暗黑破坏神2存档编辑器终极指南&#xff1a;从零基础到精通进阶 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾经为暗黑破坏神2中的角色Build优化而苦恼&#xff1f;是否想要快速测试不同装备组合的效果却受限于漫长的…

作者头像 李华
网站建设 2026/6/23 17:54:58

LobeChat Google Gemini Pro接入方法:多模态能力整合

LobeChat 与 Google Gemini Pro 的多模态整合实践 在生成式 AI 快速演进的今天&#xff0c;用户对智能助手的期待早已超越“能聊天”的基本功能。我们不再满足于仅用文字提问、等待文本回复——而是希望上传一张产品截图就能获得详细分析&#xff0c;或是拖入一份 PDF 合同便能…

作者头像 李华
网站建设 2026/6/23 13:57:03

LobeChat用量统计面板:跟踪Token消耗与GPU使用率

LobeChat用量统计面板&#xff1a;跟踪Token消耗与GPU使用率 在大模型应用日益普及的今天&#xff0c;一个看似简单的“聊天框”背后&#xff0c;往往隐藏着复杂的资源调度与成本控制挑战。当企业开始将 LLM 集成到客服系统、知识库或自动化流程中时&#xff0c;人们很快意识到…

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

基于VUE的企业咨询管理系统 [VUE]-计算机毕业设计源码+LW文档

摘要&#xff1a;随着企业咨询业务的不断发展和复杂化&#xff0c;传统的管理方式已难以满足高效、精准的业务需求。本文介绍了一种基于VUE框架开发的企业咨询管理系统&#xff0c;详细阐述了系统的需求分析、技术选型、架构设计、功能模块实现等内容。该系统涵盖了系统用户管理…

作者头像 李华
网站建设 2026/6/23 19:16:19

C++元编程完全指南

C元编程完全指南&#xff1a;从入门到精通 目录 什么是元编程模板基础模板元编程核心技术类型萃取与类型操作SFINAE与enable_ifconstexpr与编译期计算变参模板模板特化与偏特化类型列表与元容器实战案例C20概念与约束性能优化与最佳实践 什么是元编程 元编程&#xff08;Met…

作者头像 李华