剑指offer 面试题36.二叉搜索树与双向链表
中序递归,一个pre节点记录前一个节点
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* pre=nullptr;
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==nullptr){
return nullptr;
}
func(pRootOfTree);
while(pRootOfTree->left){
pRootOfTree=pRootOfTree->left;
}
return pRootOfTree;
}
void func(TreeNode* pRootOfTree){
if(pRootOfTree==nullptr){
return;
}
Convert(pRootOfTree->left);
if(pre!=nullptr){
pre->right=pRootOfTree;
pRootOfTree->left=pre;
}
pre=pRootOfTree;
Convert(pRootOfTree->right);
}
};
中序迭代,一个pre节点记录前一个节点
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* pre=nullptr;
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree==nullptr){return nullptr;}
stack<TreeNode*> sta;
TreeNode* cur=pRootOfTree;
while(cur or not sta.empty()){
if(cur){
sta.push(cur);
cur=cur->left;
}
else{
cur=sta.top();
sta.pop();
if(pre!=nullptr){
pre->right=cur;
cur->left=pre;
}
pre=cur;
cur=cur->right;
}
}
while(pRootOfTree->left){
pRootOfTree=pRootOfTree->left;
}
return pRootOfTree;
}
};
递归,func(root)将root为根的子树转化为双向链表,返回长度为2的vector,vec[0]为子树链表的头,vec[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)
{
return func(pRootOfTree)[0];
}
vector<TreeNode*> func(TreeNode* root){
if(root==nullptr){return {nullptr,nullptr};}
auto vec_le=func(root->left);
auto vec_ri=func(root->right);
if(vec_le[1]!=nullptr){
vec_le[1]->right=root;
root->left=vec_le[1];
}
if(vec_ri[0]!=nullptr){
vec_ri[0]->left=root;
root->right=vec_ri[0];
}
vector<TreeNode*> res(2,root);
if(vec_le[0]!=nullptr){
res[0]=vec_le[0];
}
if(vec_ri[1]!=nullptr){
res[1]=vec_ri[1];
}
return res;
}
};
剑指offer 面试题36.二叉搜索树与双向链表的更多相关文章
- 剑指Offer:面试题27——二叉搜索树与双向链表(java实现)
问题描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路: 将树分为三部分:左子树,根结点,右子树. 1.我们要把根结点与左 ...
- 剑指Offer - 九度1503 - 二叉搜索树与双向链表
剑指Offer - 九度1503 - 二叉搜索树与双向链表2014-02-05 23:39 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树 ...
- 剑指Offer:面试题24——二叉搜索树的后序遍历序列(java实现)
问题描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 思路: 1.首先后序遍历的结果是[(左子 ...
- 剑指offer(26)二叉搜索树与双向链表
题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 题目分析 要生成排序的双向列表,那么只能是中序遍历,因为中序遍历才能从小到 ...
- 【剑指Offer】26、二叉搜索树与双向链表
题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 解题思路: 首先要理解此题目的含义,在双向链表中,每个结 ...
- 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列
剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...
- 《剑指offer》面试题36. 二叉搜索树与双向链表
问题描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表.要求不能创建任何新的节点,只能调整树中节点指针的指向. 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜 ...
- 剑指offer(20)二叉搜索树与双向表
题目: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路一:递归法 1.将左子树构造成双链表,并返回链表头节点. 2.定位至左子 ...
- 剑指offer(23)二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 题目分析 1.后续遍历我们可以知道,最右边的是根节 ...
随机推荐
- linux基础之CentOS启动流程
一.基本概念 内核设计流派: 单内核设计:Linux //所有功能集成于同一个程序 微内核设计:Windows,Solaris //每种功能使用一个单独子系统实现 Linux内核特点: 支持模块化:. ...
- ps导出svg
svg初识 看到一些复杂的svg图形很好奇是手写出来的么,看了源码望而却步.网上看到ps都可以导出svg,然后试了下. 需要加载一个脚本,js写的,把文件复制到路径后重启ps,修改图形名字,然后保存成 ...
- 深信服SCSA
最近应公司要求报了SCSA课程,老师讲解的可谓是非常的专业以及详细,不止深信服产品及其配置,还有VPN,网络基础的原理介绍等等,产品不用说,工作中会遇到,能学即学.最好的要数网络发包原理,建立连接等底 ...
- ansible-七种武器
1. ansible命令 2. ansible-doc是ansible模块说明文档,针对每个模块都有详细用法说明以及应用案例介绍 3. ansible-console是ansible为用户提供的一款交 ...
- AOPS论坛上100+100个积分
100+10 rare and irresistible integrals I bring you many beautiful integrals that I have collected ov ...
- luogu P2158 [SDOI2008]仪仗队 (欧拉函数)
欧拉函数裸题 可惜我太久没做题忘了欧拉函数是什么了... 注意判断一下n = 1的情况就好了 #include <cstdio> using namespace std; ; typede ...
- 类的成员和属性_python
一.字段和方法分类 方法分类: 二.属性(将方法伪装成字段) 三种伪装方式:@property @perr.setter @perr.deleter 属性使用的场景:分页 三.公有成员和私有成员 私 ...
- H5手机端开发问题及解决方案
ios竖屏拍照上传,图片被旋转问题 1.通过第三方插件exif-js获取到图片的方向2.new一个FileReader对象,加载读取上传的图片3.在fileReader的onload函数中,得到的图片 ...
- win10驱动签名禁用与启动
禁用:https://jingyan.baidu.com/article/624e74594dbc8d34e8ba5aa6.html?qq-pf-to=pcqq.c2c 启用或恢复:https://z ...
- MyEclipse启动Tomcat报错:Could not find the main class: org.apache.catalina.startup
问题描述 Could not find the main class:org.apache.catalina.startup.Bootstrap. Program will exit 问题原因 主要原 ...