给你二叉树的根结点
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)
额外空间)展开这棵树吗?
思路:dfs + 前序遍历
时间复杂度:O(N)
空间复杂度:O(N)
/*** Definition for a binary tree node.* type TreeNode struct {* Val int* Left *TreeNode* Right *TreeNode* }*/funcflatten(root*TreeNode) { preOrderList :=dfs(root) fori :=1; i<len(preOrderList); i++ { preOrderList[i-1].Left=nilpreOrderList[i-1].Right=preOrderList[i] } } funcdfs(node*TreeNode) []*TreeNode { varres []*TreeNode// 注意:定义局部数组变量ifnode==nil { returnres } res=append(res, node) res=append(res, dfs(node.Left)...) // 语法糖res=append(res, dfs(node.Right)...) returnres}