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

1 2
| 输入:root = [1,2,5,3,4,null,6] 输出:[1,null,2,null,3,null,4,null,5,null,6]
|
示例 2:
示例 3:
提示:
- 树中结点数在范围
[0, 2000]
内
-100 <= Node.val <= 100
解题思路
将二叉树展开为单链表之后,单链表中的节点顺序即为二叉树的前序遍历访问各节点的顺序。因此,可以对二叉树进行前序遍历,获得各节点被访问到的顺序。由于将二叉树展开为链表之后会破坏二叉树的结构,因此在前序遍历结束之后更新每个节点的左右子节点的信息,将二叉树展开为单链表。
代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| public class Solution114Case1 { public static void flatten(TreeNode root) { List<TreeNode> list = new ArrayList<>(); preOrder(root, list); for (int i = 1; i < list.size(); i++) { TreeNode prev = list.get(i - 1); TreeNode curr = list.get(i); prev.left = null; prev.right = curr; } }
private static void preOrder(TreeNode root, List<TreeNode> list) { if (root == null) { return; } list.add(root); preOrder(root.left, list); preOrder(root.right, list); }
public static void main(String[] args) { TreeNode node4 = new TreeNode(4); TreeNode node5 = new TreeNode(5); TreeNode node2 = new TreeNode(2, null, node4); TreeNode node3 = new TreeNode(3, null, node5); TreeNode node1 = new TreeNode(1, node2, node3); flatten(node1); } }
|