一、题目
给你二叉树的根结点 root ,请你将它展开为一个单链表:
- 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
- 展开后的单链表应该与二叉树 先序遍历 顺序相同。
点击查看原题
难度级别: 中等
二、思路
1)数组记录
2)递归
定义flatten函数能够将其改为单链表,所以,进行先序遍历,先将左右子树进行递归,整理成单链表后,遍历左孩子单链表到尾节点,与右孩子单链表相连
三、代码
1)数组记录
class Solution {private List<TreeNode> ts;public void flatten(TreeNode root) {ts = new ArrayList();inorder(root);for (int i = 1; i < ts.size(); i++) {ts.get(i-1).left = null;ts.get(i-1).right = ts.get(i);}}public void inorder(TreeNode root) {if (root == null) {return;}ts.add(root);inorder(root.left);inorder(root.right);}}
2)递归
class Solution {public void flatten(TreeNode root) {if (root == null) {return ;}flatten(root.left);flatten(root.right);TreeNode memo = root.right;root.right = root.left;root.left = null;TreeNode t = root;while (t.right != null) {t = t.right;}t.right = memo;}}
时间复杂度O(n),空间复杂度O(logn)
