二叉搜索树与双向链表

描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示

数据范围:输入二叉树的节点数10000≤n≤1000,二叉树中每个节点的值

要求:空间复杂度O(1)O(1)(即在原树上操作),时间复杂度 O(n)O(n)

注意:

  1. 要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
  2. 返回链表中的第一个节点的指针
  3. 函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构
  4. 你不用输出双向链表,程序会根据你的返回值自动打印输出

输入描述

二叉树的根节点

返回值描述

双向链表的其中一个头节点。

示例1

输入:
{10,6,14,4,8,12,16}
返回值:
From left to right are:4,6,8,10,12,14,16;From right to left are:16,14,12,10,8,6,4;
说明:
输入题面图中二叉树,输出的时候将双向链表的头节点返回即可。

示例2

输入:
{5,4,#,3,#,2,#,1}
返回值:
From left to right are:1,2,3,4,5;From right to left are:5,4,3,2,1;
说明:5/4/3/2/1
树的形状如上图

解题思路

  该题相对简单(不优化的情况下),结合队列或者栈对二叉树进行广度或者深度遍历,然后使用双向链表的常识进行判断即可解题。

源代码

/*
struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {}
};*/
class Solution {public:TreeNode* Convert(TreeNode* pRootOfTree) {if (pRootOfTree == nullptr)return pRootOfTree;queue<TreeNode*> queueNode;TreeNode* pStart, *pEnd, *node;queueNode.push(pRootOfTree);pStart = nullptr;pEnd = pStart;while (!queueNode.empty()) {node = queueNode.front();queueNode.pop();if (node->left)queueNode.push(node->left);if (node->right)queueNode.push(node->right);//处理第一个插入结点if (pStart == nullptr) {pStart = node;pEnd = pStart;node->left = nullptr;node->right = nullptr;}//处理其它结点else {if (pStart->val >= node->val) {node->right = pStart;pStart->left = node;pStart = node;node->left = nullptr;} else {TreeNode* temp = pStart->right;while (temp != nullptr) {if (temp->val <= node->val)temp = temp->right;else break;}if (temp) {TreeNode* tempNode = temp->left;node->right = temp;temp->left = node;tempNode->right = node;node->left = tempNode;} else {pEnd->right = node;node->left = pEnd;pEnd = node;node->right = nullptr;}}}}return pStart;}
};

二叉搜索树与双向链表(C++)相关推荐

  1. 剑指offer:面试题36. 二叉搜索树与双向链表

    题目: 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的二叉搜索树为例: ...

  2. [二叉树]二叉搜索树转换为双向链表(剑指Offer26)

    [试题描述] 将二叉搜索树转换为双向链表 对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点. 思路一: 采用递归思想,对于二叉搜索 ...

  3. 【剑指offer】二叉搜索树转双向链表,C++实现

    原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树节点的定义 struct TreeNod ...

  4. 【LeetCode】剑指 Offer 36. 二叉搜索树与双向链表

    [LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 文章目录 [LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 package offer;//定义节点 class ...

  5. java 双向链表_Day26:二叉搜索树与双向链表

    剑指Offer_编程题--二叉搜索树与双向链表 题目描述: 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的节点.只能调整树中节点指针的指向. 具体要求: 时间限制: ...

  6. 【IT笔试面试题整理】二叉搜索树转换为双向链表

    [试题描述] 将二叉搜索树转换为双向链表 对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点. 思路一: 采用递归思想,对于二叉搜索 ...

  7. 【重点】剑指offer——面试题27:二叉搜索树与双向链表

    剑指offer--面试题27:二叉搜索树与双向链表 Solution1: 这是书上的代码,要理解好最近几道题,对指针的操作比较多... class Solution { public:TreeNode ...

  8. java面试(二)--(1)EJB的几种类型(2)Hibernate的悲观锁和乐观锁(3) 二叉搜索树与双向链表

    1.请说明一下EJB的几种类型分别是什么? EJB(Enterprise JavaBean)是J2EE服务器端的组件模型,EJB包括会话Bean(Session Bean).实体Bean(Entity ...

  9. 二叉树OJ(一)二叉树的最大深度 二叉搜索树与双向链表 对称的二叉树

    二叉树的最大深度 二叉树中和为某一值的路径(一) 二叉搜索树与双向链表 对称的二叉树 二叉树的最大深度 描述 求给定二叉树的最大深度, 深度是指树的根节点到任一叶子节点路径上节点的数量. 最大深度是所 ...

  10. 【剑指offer-C++】JZ36:二叉搜索树与双向链表

    [剑指offer-C++]JZ36:二叉搜索树与双向链表 题目描述 解题思路 题目描述 描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.如下图所示: 数据范围:输入二叉树的节点数 0 ...

最新文章

  1. js插件类库组织与管理
  2. HDU2021 发工资咯
  3. 10张Gif动图让你弄懂递归等概念
  4. Windows命令行参数的知识(一)
  5. 关于货仓选址问题的方法及证明(在数轴上找一点使得该点到所有其他点的距离之和最小)...
  6. Unity 2018.3地形功能更新介绍
  7. 天地一体化信息网络发展与拟态技术应用构想
  8. 01.26 小组功能初步总结
  9. c++分治法求最大最小值实现_你所不了解的分治算法
  10. .xyz域名注册总量TOP10:阿里云挤进十强 位居榜尾
  11. c语言的基本案例猴子,[转载]猴子选大王问题(C语言实现)
  12. JSP基础--J2EE赢在起跑线
  13. [转载]allowTransparency属性
  14. 徐培成大数据第一季java基础-徐培成-专题视频课程
  15. 在火狐浏览器打开xpath_元素定位工具:火狐浏览器Try Xpath插件
  16. OS和Linux笔记
  17. 渗透测试八个步骤【渗透测试流程】
  18. 网络运营推广具体做什么工作
  19. VLAN内端口隔离技术
  20. 【Python】200行的文字RPG游戏

热门文章

  1. PyTorch1.2.0版本来啦!居然还有全套视频!让你快速熟练掌握深度学习框架!
  2. 如何高效并快速的掌握NLP与深度学习路径?来公众号寻找经验吧~
  3. 【概率笔记】条件概率这样学才快啦
  4. 如何到top5%?NLP文本分类和情感分析竞赛总结
  5. 小爱同学,生命的意义是什么?
  6. 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)
  7. 暨“与孙鑫老师面对面,畅谈程序人生”专题讲座
  8. 一定质量的封闭气体被压缩后_螺杆压缩机转子型线设计原则及发展过程
  9. matlab liccode,车牌识别的matlab程序--(详细注释,并有使用注意点)
  10. Dart 基础篇-所有知识点架构