【剑指offer】二叉搜索树转双向链表,C++实现
原创博文,转载请注明出处!
# 题目
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
- 二叉树节点的定义
struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
}
- 二叉搜索树转双向链表的例子

# 思路
- 二叉搜索树的性质
- 二叉搜索树是左子树<根节点<右子树
- 二叉搜索树的中序遍历是递增的有序序列
- 二叉搜索树转双向链表的思路
- 首先:利用BST的中序遍历得到有序序列(递归)
- 其次:通过调整节点指针,将有序链表调整为双向链表

# 代码
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == nullptr) return nullptr;
// 双向链表尾节点
TreeNode* list_last = nullptr;
// 递归建立双向链表
ConvertNode(pRootOfTree,list_last);
// 查找双向链表首节点
while(list_last->left != nullptr)
{
list_last = list_last->left;
}
// 返回双向链表的首节点
return list_last;
}
// 对BST中序遍历,得到有序序列;调整序列元素的指针,将有序序列调整为双向链表
void ConvertNode(TreeNode* cur,TreeNode *&list_last) // 注意形参
{
// 边界条件(递归出口)
if(cur==nullptr) return ;
// 遍历左子树
if(cur->left != nullptr) ConvertNode(cur->left,list_last);
// 建立双向链接
cur->left = list_last; // 单侧链接
if(list_last != nullptr) list_last->right = cur; // 单侧链接
list_last = cur;
//遍历右子树
if(cur->right != nullptr) ConvertNode(cur->right,list_last);
}
};
【剑指offer】二叉搜索树转双向链表,C++实现的更多相关文章
- 剑指offer 二叉搜索树与双向链表
html, body { font-size: 15px; } body { font-family: Helvetica, "Hiragino Sans GB", 微软雅黑, & ...
- 剑指offer 二叉搜索树和双向链表
剑指offer 牛客网 二叉搜索树和双向链表 # -*- coding: utf-8 -*- """ Created on Tue Apr 9 18:58:36 2019 ...
- 剑指Offer——二叉搜索树与双向链表
题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析: 二叉搜索树,中序遍历就是排序的. 所以我们利用中序遍历,将前后两 ...
- 用js刷剑指offer(二叉搜索树与双向链表)
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 牛客网链接 js代码 /* function TreeNode(x) { ...
- [剑指Offer]36-二叉搜索树与双向链表
链接 https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&tPa ...
- 剑指Offer-26.二叉搜索树与双向链表(C++/Java)
题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 分析: 创建两个指针,分别指向要处理的当前元素和当前元素的前一个元素.利用中 ...
- 剑指Offer 二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 思路: 后续遍历数组的尾部为根节点,前面的部分 ...
- 剑指Offer——二叉搜索树的第k个结点
题目描述: 给定一颗二叉搜索树,请找出其中的第k大的结点. 例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4 分析: 二叉搜索树中序遍历就是从小到大.只 ...
- 剑指Offer——二叉搜索树的后序遍历序列
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 分析: 二叉查找树(Binary Search ...
- [剑指offer] 二叉搜索树的后序遍历序列 (由1个后续遍历的数组判断它是不是BST)
①题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. ②思路 1.后续遍历的数组里,最后一个元素是根. 2 ...
随机推荐
- Apache, service httpd stop, Address already in use:
service httpd stopStopping httpd: [FAILED][root@testtest ...
- jQuery编程规范与最佳实践(附带一些个人的笔记)
加载jQuery-Loading jQuery 1.坚持使用CDN来加载jQuery,这种别人服务器免费帮你托管文件的便宜干嘛不占呢.点击查看使用CDN的好处,点此查看一些主流的jQuery CDN地 ...
- 读书笔记: Microsot .NET企业级应用架构设计
Microsot .NET企业级应用架构设计 Dino Esposito Andrea Saltarello 编 陈黎夫 译 人民邮电出版社 第一部分 设计原则 第1章 当代架构师和架构 ...
- spring的静态代理和动态代理
Java静态代理 Jdk动态代理 java代理模式 即Proxy Pattern,23种java常用设计模式之一.代理模式的定义:对其他对象提供一种代理以控制对这个对象的访问. 原理: 代理模式的主要 ...
- EclipseError01
1.错误:“javax.servlet.http.httpservlet was not found on the Java Build Path” 1.1. 项目上右键-->Build Pat ...
- 安装 inotify-tools
摘要 inotify-tools, 是一款google出的用于监控文件系统的软件. 一.软件下载地址官方站点地址:http://inotify-tools.sourceforge.net/仓库地址:h ...
- Swoft 快速上手小贴士
IDE一定要装注解插件PHP Annotations Request和Response里的with...开头的方法会clone $this, 而不是修改本实体, 所以设置Cookie之类的时候要$re ...
- Les13 性能管理
目标 使用Oracle Enterprise Manager监视性能 使用自动内存管理(AMM) 使用内存指导调整内存缓冲区的大小 查看与性能相关的动态视图 排除无效和不可用对象产生的故障 性能监视 ...
- Kotlin------类和对象(二)
get/set方法 声明一个属性的完整语法是 var <propertyName>[: <PropertyType>] [= <property_initializer& ...
- [洛谷U63006]导函数最小系数
U63006 导函数最小系数 题面 给出一个n次函数\(f(x)=a_{n}x^{n}+a_{n-1}x^{n-1}+...+a_{1}x+a_0\)的各项系数\(a_n,a_{n-1}...a_1, ...