递增顺序二叉查找树(树的中序遍历)Leetcode 刷题日记 2021.2.20

Leetcode 刷题日记

2021.2.20

题目链接:

https://leetcode-cn.com/problems/increasing-order-search-tree/

问题描述:

按递增顺序把二叉查找树进行重新排列
递增顺序二叉查找树(树的中序遍历)Leetcode 刷题日记 2021.2.20_第1张图片
递增顺序二叉查找树(树的中序遍历)Leetcode 刷题日记 2021.2.20_第2张图片
递增顺序二叉查找树(树的中序遍历)Leetcode 刷题日记 2021.2.20_第3张图片
递增顺序二叉查找树(树的中序遍历)Leetcode 刷题日记 2021.2.20_第4张图片

解答:

分治算法(本质是中序遍历的递归实现)

代码:

class Solution {
     
   public TreeNode increasingBST(TreeNode root) {
     
        TreeNode newRoot = root;
        while(newRoot.left != null) newRoot = newRoot.left;
        //get the new root of the tree
        if(root.left != null) {
     
            operationOnLeft(root.left).right = root;
            root.left = null;
        }
        if(root.right != null) {
     
            TreeNode[] right = operationOnRight(root.right);
            root.right = right[0];
        }
        return newRoot;
    }

    public TreeNode operationOnLeft(TreeNode root){
     
        if(root.left != null){
     
            operationOnLeft(root.left).right = root;
            root.left = null;
        }
        if(root.right != null){
     
            TreeNode[] right = operationOnRight(root.right);
            root.right = right[0];
            return right[1];
        }
        return root;
    }

    public TreeNode[] operationOnRight(TreeNode root){
     
        TreeNode[] result = new TreeNode[2];
        if(root.left != null){
     
            TreeNode[] left = operationOnRight(root.left);
            left[1].right = root;
            root.left = null;
            result[0] = left[0];
        }else{
     
            result[0] = root;
        }
        if(root.right != null){
     
            TreeNode[] right = operationOnRight(root.right);
            root.right = right[0];
            result[1] = right[1];
        }else{
     
            result[1] = root;
        }
        return result;
    }
}

分析:

时间复杂度:O(n)
空间复杂度:O(n)

运行结果:

递增顺序二叉查找树(树的中序遍历)Leetcode 刷题日记 2021.2.20_第5张图片

评注:

分治算法拥有较快的运行速度,但是内存消耗量较大。为了解决这个问题,笔者尝试了手动释放内存的办法。对于每一个在递归函数中new出来的对象,笔者在其使用完毕后都将其引用赋为null,以加快jvm对它们的回收。内存消耗明显减少。
递增顺序二叉查找树(树的中序遍历)Leetcode 刷题日记 2021.2.20_第6张图片

你可能感兴趣的:(Leetcode刷题笔记,java,leetcode)