当前位置:   article > 正文

leetcode 114. 二叉树展开为链表_二叉变链表leetcode

二叉变链表leetcode

题目

二叉树展开为链表

思路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; //1.搬左子树,将左子树变成右子树
        root.left = null;
        TreeNode p = root;
        while(p.right != null){ //找到原左子树的最右边节点
            p = p.right;
        }
        p.right = right; //2.将之前的右子树接到当前右子树的最右边
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

思路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);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

参考

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/42661
推荐阅读
相关标签
  

闽ICP备14008679号