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 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树 ...
随机推荐
- Prometheus学习系列(六)之Prometheus 查询说明
前言 本文来自Prometheus官网手册和 Prometheus简介 Prothetheus查询 Prometheus提供一个函数式的表达式语言PromQL (Prometheus Query La ...
- MTDDL 美团分布式数据访问中间件(转)
MTDDL 美团分布式数据访问中间件(转) 原文地址:MTDDL--美团点评分布式数据访问层中间件 因原文文字和图显示有问题,故整理于此,仅供参考. 业界方案 组件 简介 Atlas Qihoo 36 ...
- C# Replace字符替换函数
它可以将字串内的字符替换为别的字符,可以嵌套使用,如下: 需要注意的是,它可以把字符替换为空,但不可以替换空字符,当不确定字符串是否为空时,可以进行以下判断,再替换: 示例的完整代码: string ...
- Redis Python(二)
Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.NoSQL(Not only SQL)1.泛指非关系数据库2.不支持SQL语法3.存储结构与传统的关系型数据库 ...
- HTML连载55-网易注册界面实战之input填充
一.又学一招:想要让两个盒子高度对齐,那么让他们浮动起来 <!DOCTYPE html> <html lang="en"> <head> < ...
- Android数据库GreenDao的使用总结
一.GreenDao的介绍 GreenDAO是一个开源的Android ORM(“对象/关系映射”),通过ORM(称为“对象/关系映射”),节省了我们在数据库开发过程的时间! 通过GreenDao,我 ...
- FAQ: Oracle Flex ASM 12c / 12.1 (Doc ID 1573137.1)
FAQ: Oracle Flex ASM 12c / 12.1 (Doc ID 1573137.1) APPLIES TO: Oracle Database - Enterprise Edition ...
- 拷贝本地文件到docker容器内部
#复制本地目录的xxx到镜像内部并且为xxx docker cp /home/xxx targetImage:/home/xxx
- 微信 PC HOOK
一.概述 Web端有开源代码,但新用户登录不了 PC端也有开源代码,新老用户都能登录 市场上已有的产品:发卡机器人.多群转发机器人.营销管理机器人 基本的功能:收发消息,加人加群,收账抢红包 二.原理 ...
- nginx基础(1)
目录 一.概念 基础概念 响应码 请求和响应报文的格式 http无连接 我叫张贺,贪财好色.一名合格的LINUX运维工程师,专注于LINUX的学习和研究,曾负责某中型企业的网站运维工作,爱好佛学和跑步 ...