二叉搜索树与双向链表(C++)
二叉搜索树与双向链表
描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示
数据范围:输入二叉树的节点数10000≤n≤1000,二叉树中每个节点的值
要求:空间复杂度O(1)O(1)(即在原树上操作),时间复杂度 O(n)O(n)
注意:
- 要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继
- 返回链表中的第一个节点的指针
- 函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构
- 你不用输出双向链表,程序会根据你的返回值自动打印输出
输入描述
二叉树的根节点
返回值描述
双向链表的其中一个头节点。
示例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++)相关推荐
- 剑指offer:面试题36. 二叉搜索树与双向链表
题目: 二叉搜索树与双向链表 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的二叉搜索树为例: ...
- [二叉树]二叉搜索树转换为双向链表(剑指Offer26)
[试题描述] 将二叉搜索树转换为双向链表 对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点. 思路一: 采用递归思想,对于二叉搜索 ...
- 【剑指offer】二叉搜索树转双向链表,C++实现
原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树节点的定义 struct TreeNod ...
- 【LeetCode】剑指 Offer 36. 二叉搜索树与双向链表
[LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 文章目录 [LeetCode]剑指 Offer 36. 二叉搜索树与双向链表 package offer;//定义节点 class ...
- java 双向链表_Day26:二叉搜索树与双向链表
剑指Offer_编程题--二叉搜索树与双向链表 题目描述: 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的节点.只能调整树中节点指针的指向. 具体要求: 时间限制: ...
- 【IT笔试面试题整理】二叉搜索树转换为双向链表
[试题描述] 将二叉搜索树转换为双向链表 对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点. 思路一: 采用递归思想,对于二叉搜索 ...
- 【重点】剑指offer——面试题27:二叉搜索树与双向链表
剑指offer--面试题27:二叉搜索树与双向链表 Solution1: 这是书上的代码,要理解好最近几道题,对指针的操作比较多... class Solution { public:TreeNode ...
- java面试(二)--(1)EJB的几种类型(2)Hibernate的悲观锁和乐观锁(3) 二叉搜索树与双向链表
1.请说明一下EJB的几种类型分别是什么? EJB(Enterprise JavaBean)是J2EE服务器端的组件模型,EJB包括会话Bean(Session Bean).实体Bean(Entity ...
- 二叉树OJ(一)二叉树的最大深度 二叉搜索树与双向链表 对称的二叉树
二叉树的最大深度 二叉树中和为某一值的路径(一) 二叉搜索树与双向链表 对称的二叉树 二叉树的最大深度 描述 求给定二叉树的最大深度, 深度是指树的根节点到任一叶子节点路径上节点的数量. 最大深度是所 ...
- 【剑指offer-C++】JZ36:二叉搜索树与双向链表
[剑指offer-C++]JZ36:二叉搜索树与双向链表 题目描述 解题思路 题目描述 描述:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.如下图所示: 数据范围:输入二叉树的节点数 0 ...
最新文章
- js插件类库组织与管理
- HDU2021 发工资咯
- 10张Gif动图让你弄懂递归等概念
- Windows命令行参数的知识(一)
- 关于货仓选址问题的方法及证明(在数轴上找一点使得该点到所有其他点的距离之和最小)...
- Unity 2018.3地形功能更新介绍
- 天地一体化信息网络发展与拟态技术应用构想
- 01.26 小组功能初步总结
- c++分治法求最大最小值实现_你所不了解的分治算法
- .xyz域名注册总量TOP10:阿里云挤进十强 位居榜尾
- c语言的基本案例猴子,[转载]猴子选大王问题(C语言实现)
- JSP基础--J2EE赢在起跑线
- [转载]allowTransparency属性
- 徐培成大数据第一季java基础-徐培成-专题视频课程
- 在火狐浏览器打开xpath_元素定位工具:火狐浏览器Try Xpath插件
- OS和Linux笔记
- 渗透测试八个步骤【渗透测试流程】
- 网络运营推广具体做什么工作
- VLAN内端口隔离技术
- 【Python】200行的文字RPG游戏
热门文章
- PyTorch1.2.0版本来啦!居然还有全套视频!让你快速熟练掌握深度学习框架!
- 如何高效并快速的掌握NLP与深度学习路径?来公众号寻找经验吧~
- 【概率笔记】条件概率这样学才快啦
- 如何到top5%?NLP文本分类和情感分析竞赛总结
- 小爱同学,生命的意义是什么?
- 基于Oracle的SQL优化(社区万众期待 数据库优化扛鼎巨著)
- 暨“与孙鑫老师面对面,畅谈程序人生”专题讲座
- 一定质量的封闭气体被压缩后_螺杆压缩机转子型线设计原则及发展过程
- matlab liccode,车牌识别的matlab程序--(详细注释,并有使用注意点)
- Dart 基础篇-所有知识点架构