【剑指Offer】【树】【双向链表】二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
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】【树】【双向链表】二叉搜索树与双向链表的更多相关文章
- 剑指offer 27:二叉搜索树与双向链表
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 解题思路 采用中序遍历遍历二叉树,利用二叉排序树的特性,顺次连接节点,形成 ...
- 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器
剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...
- 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 + 二叉排序树 + 最近公共祖先
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 Offer_68_1 题目描述 方法一:迭代法 由于该题的二叉树属于排序二叉树,所以相对较简单. 只需要判断两个结点是否在根节点的左右子树中 ...
- 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q ...
- 剑指OFFER之从二叉搜索树的后序遍历序列(九度OJ1367)
题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入: 每个测试案例包括2行: 第一行为1个整数 ...
- 剑指offer 24:二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路 后序遍历,顾名思义根节点位于尾部,故可将 ...
- 剑指offer 面试题. 二叉搜索树的第k个结点
题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. 解: 由于二叉搜索树的中序遍历是升序,所以在中 ...
- 剑指offer系列——62.二叉搜索树的第k个结点
Q:给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. T: 中序遍历,递归: int count = 0; public ...
- 剑指offer26:将二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
1 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 2 思路和方法 在二叉搜索树中,每个结点都有两个分别指向其左.右子树的 ...
- 剑指offer面试题24-二叉搜索树的后序遍历序列
题目: /* * 输入一个整数数组,推断该数组是不是某二叉搜索树的兴许遍历的结果.<br/> * 假设是则返回true,否则返回false.<br/> * 如果输入的数组 ...
随机推荐
- [R语言] 基于R语言实现环状条形图的绘制
环状条形图(Circular barplot)是条形图的变体,图如其名,环状条形图在视觉上很吸引人,但也必须小心使用,因为环状条形图使用的是极坐标系而不是笛卡尔坐标系,每一个类别不共享相同的Y轴.环状 ...
- Spark详解(03) - Spark3.0.0运行环境安装
Spark详解(03) - Spark3.0.0运行环境安装 Spark运行模式 Spark常见部署模式: Local模式:在本地部署单个Spark服务 所谓的Local模式,就是不需要其他任何节点资 ...
- js取不到iframe元素
跨域 iframe 请绕道,下文是针对非跨域 iframe 的问题排除 1.iframe 取不到值的问题的原因 1. 父页面未加载完成 2. iframe 未加载完成 3. 语法使用错误 4. 跨域( ...
- [C++]C++11右值引用
右值引用的概念(摘自C++Primer) 左值和右值的概念 1.左值和右值是表达式的属性,一些表达式要求生成左值,一些表达式要求生成右值:左值表达式通常是一个对象的身份,而一个右值表达式表示的是对象的 ...
- 基于windows系统使用GNVM进行node切换版本
GNVM是什么? GNVM 是一个简单的 Windows 下 Node.js 多版本管理器,类似的 nvm nvmw nodist . 安装 进入官网,下载你所需要的包,直达链接 下载完成 放到我们的 ...
- angular在服务中调用组件的某个方法,并传参给组件,(反向调用),变量改变后,强制更新视图
需要被调用方法的组件文件 import { Component, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'; ...
- 大数据实时多维OLAP分析数据库Apache Druid入门分享-下
@ 目录 架构 核心架构 外部依赖 核心内容 roll-up预聚合 列式存储 Datasource和Segments 位图索引 数据摄取 查询 集群部署 部署规划 前置条件 MySQL配置 HDFS配 ...
- 学习python的编程语言
前言 那么多编程语言,为什么学python 易于学习,是所有编程语言当中最容易学习的 没有最好的语言,只有最合适的语言 第一章 python基础 1. 课程整体介绍 课程整体介绍 python编程基础 ...
- 鸣人的影分身(等级考试4级 2021-03 T3)
题目: 此题题干又臭又长,直接看简化版. 鸣人的影分身(等级考试4级 2021-03 T3)等效于 把m个苹果分到n个盘子中,问有几种可能? dp[i][j]表示有i个盘子j个苹果时有多少种放法. 用 ...
- Vue15 v-for和key的作用及原理
部分转自https://blog.csdn.net/cun_king/article/details/120714227 1 v-for指令 1.1 简介 用于遍历. 当在组件中使用 v-for 时, ...