2021-12-09:二叉树展开为链表。
给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
力扣114。

答案2021-12-09:

递归或者莫里斯遍历。
时间复杂度:O(N)。
空间复杂度:O(树的高度)。用莫里斯遍历可优化成O(1)。

代码用golang编写。代码如下:

package main

import "fmt"

func main() {
head := NewTreeNode(1)
head.left = NewTreeNode(2)
head.right = NewTreeNode(3)
head = convert(head)
for head != nil {
fmt.Println(head.val)
head = head.right
}
} type TreeNode struct {
val int
left *TreeNode
right *TreeNode
} func NewTreeNode(value int) *TreeNode {
ret := &TreeNode{}
ret.val = value
return ret
} func convert(head *TreeNode) *TreeNode {
if head == nil {
return nil
}
return process(head).head
} type Info struct {
head *TreeNode
tail *TreeNode
} func NewInfo(h, t *TreeNode) *Info {
res := &Info{}
res.head = h
res.tail = t
return res
} func process(x *TreeNode) *Info {
if x == nil {
return nil
}
leftInfo := process(x.left)
rightInfo := process(x.right)
// 2...4 5 6...13
if leftInfo != nil {
leftInfo.tail.right = x
x.left = leftInfo.tail
}
if rightInfo != nil {
x.right = rightInfo.head
rightInfo.head.left = x
}
var head *TreeNode
if leftInfo != nil {
head = leftInfo.head
} else {
head = x
}
var tail *TreeNode
if rightInfo != nil {
tail = rightInfo.tail
} else {
tail = x
}
return NewInfo(head, tail)
}

执行结果如下:


左神java代码

2021-12-09:二叉树展开为链表。 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左的更多相关文章

  1. 2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串)

    2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串) https://www.luogu.com.cn/problem/P2824 题意: 在 20 ...

  2. 2021.12.08 平衡树——FHQ Treap

    2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...

  3. 剑指offer25:复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),结果返回复制后复杂链表的head。

    1 题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用 ...

  4. php实现反转链表(链表题一定记得画图)(指向链表节点的指针本质就是一个记录地址的变量)($p->next表示的是取p节点的next域里面的数值,next只是p的一个属性)

    php实现反转链表(链表题一定记得画图)(指向链表节点的指针本质就是一个记录地址的变量)($p->next表示的是取p节点的next域里面的数值,next只是p的一个属性) 一.总结 链表反转两 ...

  5. 复制一个带random指针的链表

    一个单链表,其中除了next指针外,还有一个random指针,指向链表中的任意某个元素.如何复制这样一个链表呢? 通过next来复制一条链是很容易的,问题的难点在于如何恰当地设置新链表中的random ...

  6. C语言:根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,-主函数中放入一个带头节点的链表结构中,h指向链表的头节点。fun函数找出学生的最高分-使用插入排序法对字符串中的字符进行升序排序。-从文件中找到指定学号的学生数据,读入次学生数据,

    //根据形参c中指定的英文字母,按顺序打印出若干后继相邻字母,输出字母的大小与形参c一致,数量由形参d指定.例如:输入c为Y,d为4,则输出ZABC. #include <stdio.h> ...

  7. C语言:判断字符串是否为回文,-函数fun将单向链表结点数据域为偶数的值累加起来。-用函数指针指向要调用的函数,并进行调用。

    //函数fun功能:用函数指针指向要调用的函数,并进行调用. #include <stdio.h> double f1(double x) { return x*x; } double f ...

  8. 【LeetCode】138. Copy List with Random Pointer 复制带随机指针的链表 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人公众号:负雪明烛 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https:/ ...

  9. [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表

    A linked list is given such that each node contains an additional random pointer which could point t ...

  10. [Java]LeetCode138. 复制带随机指针的链表 | Copy List with Random Pointer

    A linked list is given such that each node contains an additional random pointer which could point t ...

随机推荐

  1. 一个struts1框架的小案例

    具体如下: <span style="font-size:18px;"><?xml version="1.0" encoding=" ...

  2. C# 微信开发 微信号接入 (附完整源码)(1)

    1. 首先配置微信服务器设置 a)        企业号配置信息 (详见:ConfigurationManager类) b)        企业号服务器配置: ConfigurationManager ...

  3. vue 缓存后台获取的token

    代码 localStorage.setItem("token",res.data.data);// 用localStorage缓存token值

  4. laravel whereHas sum & addSelect sum

    $users = User::select('id', 'username', 'coins', 'cut') ->when(request()->has('agent_tip_sum') ...

  5. nginx配置https详细过程

    准备工作 需要先准备好你域名对应的证书和私钥,也就是cert证书和key.我部署是很常见的ng+tomcat双层配置,ng作为前端的代理,所以tomcat就不需要自己处理https,ng作为代理以ht ...

  6. Java所用相关软件的大致安装流程

    JAVA下载流程 一.相关环境的安装与配置 1.JDK的下载 去官网搜索相应的java版本,并进行下载 官网链接:www.xfdown.com/soft/125774.html在该链接下,可以下载ja ...

  7. Matlab笔记--Matlab概述(初登场)

    Matlab概述 安装MATLAB教程 可以参考这里:https://www.cnblogs.com/sixuwuxian/p/15858196.html Matlab的启动 右键图标,选择属性,可以 ...

  8. Python学习笔记--高阶技巧(二)

    Socket服务端开发 基本步骤如下: socket客户端开发 基本步骤如下: 1.创建socket对象 2.连接到服务器 3.发送消息 4.接收返回消息 5.关闭连接 正则表达式 基础方法 matc ...

  9. .Net7 CLR的调用函数和编译函数

    前言 .Net运行模型,无非就两个过程.一个是调用入口函数,另外一个就是编译入口函数.前者主调用,后者主编译. 概括 一:入口函数:RunMainInternal 所有的.Net程序,包括控制台,We ...

  10. 从开源模型、框架到自研,声网 Web 端虚拟背景算法正式发布

    根据研究发现,在平均 38 分钟的视频会议里面,大概会有 13 分钟左右的时间用于处理和干扰相关的事情.同时研究也表明在参加在线会议的时候,人们更加倾向于语音会议,其中一个关键原因就是大家不希望个人隐 ...