题目: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) 额外空间)展开这棵树吗?
思路
我们可以通过递归的方式前序遍历二叉树。
前序遍历二叉树, 把节点按照前序遍历的顺序放入list中。
把list中的值取出来并放在current节点的右子树。
时间复杂度:O(n)
空间复杂度:O(n)
代码
public void flatten(TreeNode root) {
TreeNode current = new TreeNode();
List<TreeNode> list = new LinkedList<>();
// 前序遍历二叉树, 把节点按照前序遍历的顺序放入list中
preorderHelper(list, root);
// 把list中的值取出来并放在current节点的右子树
for (TreeNode treeNode : list) {
current.left = null;
current.right = treeNode;
current = current.right;
}
}
private void preorderHelper(List<TreeNode> list, TreeNode node) {
if (node == null) {
return;
}
// 访问根节点
list.add(node);
// 访问左子树
preorderHelper(list, node.left);
// 访问右子树
preorderHelper(list, node.right);
}