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 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树 ...
随机推荐
- Python高级特性——迭代器
可以直接用for循环的数据类型有: 集合数据类型,如:list.tuple.dict.set.str等: 生成器generator,包括生成器和带yield的generator function. 以 ...
- 解决测试redis集群时报"java.lang.NumberFormatException: For input string: "7003@17003..7002@17002"等异常
一.前言 关于redis5.0的集群模式下,通过客户端测试代码调试报"Exception in thread "main" java.lang.NumberFormatE ...
- 表空间相关SQL
--查表空间使用率情况(含临时表空间)SELECT D.TABLESPACE_NAME "Name", D.STATUS "Status", TO_CHAR(N ...
- 经典案例:如何优化Oracle使用DBlink的SQL语句
转自 https://blog.csdn.net/Enmotech/article/details/78788083 作者介绍 赵全文 就职于太极计算机股份有限公司,在中央电化教育馆做Oracle D ...
- Ubuntu系统修改资源为阿里云镜像
一般都会推荐使用国内的镜像源,比如163或者阿里云的镜像服务器将下列文本添加到/etc/apt/sources.list文件里 deb http://mirrors.aliyun.com/ubuntu ...
- August 18th, 2019. Week 34th, Sunday
Fear doesn't shut you down, it wakes you up. 恐惧不会消磨你的意志,它能激发你的潜能. We all know that fear is powerful, ...
- oracle创建新用户并授予权限
1.同时按下WIN键+R键打开“运行”,输入cmd,回车进入命令提示符 2.输入“sqlplus”后按下回车键,提示输入用户名,输入“sys as sysdba”,按下回车,输入口令,即四-13中设置 ...
- Objective-C中 #include 和 #import 的区别
由于 Objective-C 兼容 C 语言,所以导入文件时, 可以使用 #include,也可以使用 #import (Objective-C 新增的) 如: #include <stdio. ...
- 数组类的创建——DynamicArray.h
完成DynamicArray类的具体实现 DynamicArray设计要点——类模板 动态确定内部数组空间的大小 实现函数返回数组长度 拷贝构造和赋值操作 DynamicArray类的声明 templ ...
- 关于定义序列化器时,read_only和write_only有什么作用
关于序列化和反序列化 在谈论前,先说一下序列化和反序列化,这两个概念最初是在学习json的时候提出来的,回头来看,其实可以用最初的理解就可以了 序列化就是将对象转化方便传输和存储字节序列,例如js ...