acwing 49. 二叉搜索树与双向链表
地址:https://www.acwing.com/problem/content/87/
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。
要求不能创建任何新的结点,只能调整树中结点指针的指向。
注意:
- 需要返回双向链表最左侧的节点。
例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。

解法
树的处理 一半都是递归 分为 根 树的左子树 和树的右子树
子树也是一棵树 进行递归处理 向上返回一个双链表 返回链表的头尾
最后全部转化链表

代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public: TreeNode* rethead = NULL; TreeNode* gleft = NULL;
TreeNode* gright = NULL; void convertInner(TreeNode* root)
{
if (NULL == root) return; if (root->val < rethead->val) rethead = root; if (root->left == NULL && root->right == NULL) {
gleft = root; gright = root;
return;
}
else if (root->left != NULL && root->right == NULL) {
convertInner(root->left);
gright->right = root;
root->left = gright;
gright = root;
}
else if (root->right != NULL && root->left == NULL) {
convertInner(root->right);
gleft->left = root;
root->right = gleft;
gleft = root;
}
else if (root->right != NULL && root->left != NULL) {
convertInner(root->left);
gright->right = root;
root->left = gright; TreeNode* leftcopy = gleft; convertInner(root->right);
gleft->left = root;
root->right = gleft;
gleft = leftcopy;
}
} TreeNode* convert(TreeNode* root) {
if (NULL == root) return NULL;
rethead = root; if (root->left == NULL && root->right == NULL) return root; if (root->left != NULL && root->right == NULL) {
convertInner(root->left);
gright->right = root;
root->left = gright;
}
else if (root->right != NULL && root->left == NULL) {
convertInner(root->right);
gleft->left = root;
root->right = gleft;
}
else if (root->right != NULL && root->left != NULL) {
convertInner(root->left);
gright->right = root;
root->left = gright; convertInner(root->right);
gleft->left = root;
root->right = gleft;
} return rethead;
} };
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public: TreeNode* rethead = NULL; TreeNode* gleft = NULL;
TreeNode* gright = NULL; void convertInner(TreeNode* root)
{
if (NULL == root) return; if (root->val < rethead->val) rethead = root; if (root->left == NULL && root->right == NULL) {
gleft = root; gright = root;
return;
}
else if (root->left != NULL && root->right == NULL) {
convertInner(root->left);
gright->right = root;
root->left = gright;
gright = root;
}
else if (root->right != NULL && root->left == NULL) {
convertInner(root->right);
gleft->left = root;
root->right = gleft;
gleft = root;
}
else if (root->right != NULL && root->left != NULL) {
convertInner(root->left);
gright->right = root;
root->left = gright; TreeNode* leftcopy = gleft; convertInner(root->right);
gleft->left = root;
root->right = gleft;
gleft = leftcopy;
}
} TreeNode* convert(TreeNode* root) {
if (NULL == root) return NULL;
rethead = root; if (root->left == NULL && root->right == NULL) return root; if (root->left != NULL && root->right == NULL) {
convertInner(root->left);
gright->right = root;
root->left = gright;
}
else if (root->right != NULL && root->left == NULL) {
convertInner(root->right);
gleft->left = root;
root->right = gleft;
}
else if (root->right != NULL && root->left != NULL) {
convertInner(root->left);
gright->right = root;
root->left = gright; convertInner(root->right);
gleft->left = root;
root->right = gleft;
} return rethead;
} };
acwing 49. 二叉搜索树与双向链表的更多相关文章
- 剑指Offer面试题:25.二叉搜索树与双向链表
一.题目:二叉搜索树与双向链表 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.比如输入下图中左边的二叉搜索树,则输出转换之后的 ...
- 剑指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 ...
- 【IT笔试面试题整理】二叉搜索树转换为双向链表
[试题描述] 将二叉搜索树转换为双向链表 对于二叉搜索树,可以将其转换为双向链表,其中,节点的左子树指针在链表中指向前一个节点,右子树指针在链表中指向后一个节点. 思路一: 采用递归思想,对于二叉搜索 ...
- 《剑指offer》— JavaScript(26)二叉搜索树与双向链表
二叉搜索树与双向链表 题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 递归思想:把大问题转换为若干小问题: 由于Ja ...
- 《剑指offer》第三十六题(二叉搜索树与双向链表)
// 面试题36:二叉搜索树与双向链表 // 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求 // 不能创建任何新的结点,只能调整树中结点指针的指向. #include < ...
- 编程算法 - 二叉搜索树 与 双向链表 代码(C++)
二叉搜索树 与 双向链表 代码(C++) 本文地址: http://blog.csdn.net/caroline_wendy 题目:输入一颗二叉搜索树, 将该二叉搜索树转换成一个排序的双向链表. 要求 ...
- 【剑指offer】二叉搜索树转双向链表,C++实现
原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 二叉树节点的定义 struct TreeNod ...
- 剑指Offer - 九度1503 - 二叉搜索树与双向链表
剑指Offer - 九度1503 - 二叉搜索树与双向链表2014-02-05 23:39 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树 ...
随机推荐
- Java生鲜电商平台-服务化后的互联网架构实战(针对生鲜电商小程序或者APP)
Java生鲜电商平台-服务化后的互联网架构实战(针对生鲜电商小程序或者APP) “微服务架构”的话题非常之火,很多朋友都在小窗我,说怎么做服务化?解答“怎么做”之前,先得了解“为什么做”. 画外音:做 ...
- SpringBoot集成swagger2.0
最近项目里要用到SpringBoot + swagger,查了其他小伙伴们的资料,或多或少有点问题,在此我再梳理一遍. 1.maven依赖 <parent> <groupId> ...
- Android Studio 第一个Android项目
创建步骤 Start a new Android Studio project 选择 Empty Activity 设置Android项目的名称.位置,开发语言 打开初始界面 初步认识Androi ...
- VUE组件 之 Drawer 抽屉
注:因为项目中用的是 element-ui 框架,而这个框架并没有抽屉组件,所以自己实现一个. 一.源码地址 https://github.com/imxiaoer/DrawerForVue 二.效果 ...
- Firefox 印象笔记剪藏插件登录国内账号
0x00 事件 俺使用的 Firefox 不是中文简体的语言,安装了剪藏插件之后,始终无法在插件中登录国内账号,也没有选项,一点击插件图标: 在查找了一些内容之后,在知乎找到一个解决方案,能开启「 切 ...
- 工具-Xmind常用快捷键/使用
1-快捷键 Ctrl+Shift+L 快捷键助手 Ctrl+Home 返回中心主题 Ctrl+] 插入摘要 Ctrl+I 插入图片 Ctrl+Shift+H 插入超链接 Ctrl+1,2,3,4,5, ...
- make && make install的区别
./configure 配置环境make 是编译的意思.就是把源码包编译成二进制可执行文件make install 就是安装的意思. make && make install 的意思是 ...
- hibernate opensission.createSQLquery 问题
在进行分页查询的时候,通常会用到,页码,每页容量等等的参数进行操作,如下图: query.list()的时候会执行得到所需要的集合的值,在这个过程中, 如果使用自定义的返回参数,比如将日期做一些基本处 ...
- java之List接口(单列集合)
List接口概述 查询API我们可知:java.util.List 接口继承自 Collection 接口,是单列集合的一个重要分支,习惯性地会将实现了 List 接口的对 象称为List集合.在Li ...
- 2019阿里天猫团队Java高级工程师面试题之第三面
2019阿里天猫团队Java高级工程师面试题之第一面 2019阿里天猫团队Java高级工程师面试题之第二面 1.说说MySQL的锁并发?加锁的机制是什么? https://www.cnblogs.co ...