题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

A:二叉树中每个节点都有一个left指针指向左节点,一个right指针指向右节点

  双向链表中每个节点都有一个prev指针指向前驱节点,一个next指针指向后继节点

  在二叉搜索树中,左节点小于父节点,右节点大于父节点;

  在排序双向链表中,前驱节点小于当前节点,后继节点大于当前节点

得到以下转化方案:

  中序遍历二叉搜索树

  转化当前节点的左节点converTree(pTree->left, prev);  

  找到当前节点pTree,pTree->left = prev

  如果prev不为空,则prev->next = pTree

  prev = prev->next往后移动

  转化当前节点的右节点

/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void converTree(TreeNode * pTree, TreeNode *&prev) //二级指针 = 指针引用 (降级,可以直接用pre操作,否则要*pre)
{
if(pTree == nullptr)
{
return ;
}
converTree(pTree->left, prev); pTree->left = prev;
if(prev != nullptr)
{
prev->right = pTree;
}
prev = pTree; converTree(pTree->right, prev);
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == nullptr)
{
return nullptr;
}
TreeNode *pTree = nullptr;
//转化
converTree(pRootOfTree,pTree);
//输出头节点
TreeNode *ret = pRootOfTree;
while(ret->left != nullptr)
{
ret = ret->left;
}
return ret;
}
};

  

【剑指Offer】【树】【双向链表】二叉搜索树与双向链表的更多相关文章

  1. 剑指offer 27:二叉搜索树与双向链表

    题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 解题思路 采用中序遍历遍历二叉树,利用二叉排序树的特性,顺次连接节点,形成 ...

  2. 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器

    剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...

  3. 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 + 二叉排序树 + 最近公共祖先

    剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 Offer_68_1 题目描述 方法一:迭代法 由于该题的二叉树属于排序二叉树,所以相对较简单. 只需要判断两个结点是否在根节点的左右子树中 ...

  4. 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

    剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q ...

  5. 剑指OFFER之从二叉搜索树的后序遍历序列(九度OJ1367)

    题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入: 每个测试案例包括2行: 第一行为1个整数 ...

  6. 剑指offer 24:二叉搜索树的后序遍历序列

    题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路 后序遍历,顾名思义根节点位于尾部,故可将 ...

  7. 剑指offer 面试题. 二叉搜索树的第k个结点

    题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4.     解: 由于二叉搜索树的中序遍历是升序,所以在中 ...

  8. 剑指offer系列——62.二叉搜索树的第k个结点

    Q:给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. T: 中序遍历,递归: int count = 0; public ...

  9. 剑指offer26:将二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

    1 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 2 思路和方法 在二叉搜索树中,每个结点都有两个分别指向其左.右子树的 ...

  10. 剑指offer面试题24-二叉搜索树的后序遍历序列

    题目: /*  * 输入一个整数数组,推断该数组是不是某二叉搜索树的兴许遍历的结果.<br/>  * 假设是则返回true,否则返回false.<br/>  * 如果输入的数组 ...

随机推荐

  1. Mybatis-plus实现数据库的增删改查操作

    目录 1.MybatisPlus简介 2.MybatisPlus注解介绍 3.常用方法 4.SpringBoot整合MybatisPlus实现增删改查的一个简单Demo 5.参考资料 1.Mybati ...

  2. Spring项目中用了这种解耦模式,经理对我刮目相看

    前言 不知道大家在项目中有没有遇到过这样的场景,根据传入的类型,调用接口不同的实现类或者说服务,比如根据文件的类型使用 CSV解析器或者JSON解析器,在调用的客户端一般都是用if else去做判断, ...

  3. python之路49 模板层标签 自定义过滤器 模板继承、模型层准备、ORM部分操作

    模板层之标签 {% if 条件1(可以自己写也可以是用传递过来的数据) %} <p>周三了 周三了</p> {% elif 条件2(可以自己写也可以用传递过来的数据) %} & ...

  4. Java类、对象以及(静态)方法的探讨

    大家好,这是我的第一篇博客.在这里我想跟大家分享一下Java最基础的Class and Object,也就是我们熟说的类和对象,以及对Java方法的探讨. 初学时的我因为没有对这里面的每一行代码思考透 ...

  5. [NOIP2017 普及组]跳房子 【题解】

    题目背景 NOIP2017 普及组 T4 题目描述 跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一. 跳房子的游戏规则如下: 在地面上确定一个起点,然后在起点右侧画 \(n ...

  6. Linux C 用GPS时间更新系统时间的方法。

    思路: 1.GPS模块会自动收到带时间信息的消息. GPS模块会收到很多的协议消息带时间信息的.我们选择"$GPRMC"这条协议.其中的时间格式有的是hhmmss(时分秒) 有的是 ...

  7. Windows Server上部署IoTdb 集群

    本文是参考官方的 IoTDB 集群版(1.0.0)的安装及启动教程:https://iotdb.apache.org/zh/UserGuide/V1.0.x/Cluster/Cluster-Setup ...

  8. Java线程池中的execute和submit

    一.概述 execute和submit都是线程池中执行任务的方法. execute是Executor接口中的方法 public interface Executor { void execute(Ru ...

  9. Quartz.Net源码Example之Quartz.Examples.AspNetCore

    Quartz.Examples.AspNetCore ​ .NetCore的Web系统,后台主要执行多个触发器任务,前台展示所有触发器信息和正在执行的作业的相关信息,还可以通过访问health-UI来 ...

  10. 容器镜像仓库-Harbor的安装及踩坑

    之前实验室的师兄让我帮忙给服务器上装一个Harbor,花了不少时间,遂记录之,以避坑. 在学习使用Harbor之前,需要了解Docker的使用,可以看看我之前的博客:应用容器引擎-Docker.Doc ...