一、题目
给你二叉树的根结点 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);
}
}
时间复杂度O(n)
,空间复杂度O(n)
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)