题目
二叉树展开为链表
思路1
- 由于函数签名的返回值为void,也就不能直接使用前序遍历的方式,达到O(1)的空间复杂度。
- 采用分解的方法,通过递归,拆解为子问题。
- 子问题为将左子树和右子树转为链表。子问题解决后,再将左子树变成右子树,原右子树接到新的右子树(原左子树)的最右边。
代码
class Solution {
public void flatten(TreeNode root) {
if(root == null) return;
flatten(root.left);
flatten(root.right);
TreeNode right = root.right;
root.right = root.left;
root.left = null;
TreeNode p = root;
while(p.right != null){
p = p.right;
}
p.right = right;
}
}
思路2
- 如果就是想利用前序遍历实现,需要增加辅助空间。
- 前序遍历traverse + 外部数组。
class Solution {
List<TreeNode> tmp = new ArrayList<>();
public void flatten(TreeNode root) {
if(root == null) return;
traverse(root);
for(int i = 1; i < tmp.size(); i++){
TreeNode pre = tmp.get(i - 1);
TreeNode next = tmp.get(i);
pre.left = null;
pre.right = next;
}
}
private void traverse(TreeNode root){
if(root == null) return;
tmp.add(root);
traverse(root.left);
traverse(root.right);
}
}
参考