114. 二叉树展开为链表 中等
给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例 1:
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [0]
输出:[0]
提示:
- 树中结点数在范围 [0, 2000] 内
- -100 <= Node.val <= 100
进阶:你可以使用原地算法(O(1) 额外空间)展开这棵树吗?
代码参考:
package main
import "fmt"
func main() {
root := &TreeNode{Val: 1}
root.Left = &TreeNode{Val: 2}
root.Left.Left = &TreeNode{Val: 3}
root.Left.Right = &TreeNode{Val: 4}
root.Right = &TreeNode{Val: 5}
flatten(root)
fmt.Println(root)
fmt.Println(root.Right)
fmt.Println(root.Right.Right)
fmt.Println(root.Right.Right.Right)
fmt.Println(root.Right.Right.Right.Right)
}
// 原地展开,不能先序遍历建新树
// 1
// / \
// 2 5
// 1
// \
// 2
// \
// 5
func flatten(root *TreeNode) {
if root == nil {
return
}
if root.Left == nil && root.Right == nil {
return
}
flatten(root.Left)
flatten(root.Right)
if root.Left != nil {
lastNode := root.Right
root.Right = root.Left // 把左子树挪到右子树上
cur := root
for cur.Right != nil {
cur = cur.Right
}
cur.Right = lastNode // 把旧右子树接到新右子树
root.Left = nil // 清空左子树
}
}
最后编辑: kuteng 文档更新时间: 2021-06-05 10:16 作者:kuteng