2021-12-09:二叉树展开为链表。 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左
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)
}
执行结果如下:
公众号:福大大架构师每日一题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
2020-12-09 2020-12-09:TCP中,慢启动是什么?