LeetCode——将二叉搜索树变平衡?

Q:给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。
如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平衡的 。
如果有多种构造方法,请你返回任意一种。

输入:root = [1,null,2,null,3,null,4,null,null]
输出:[2,1,3,null,null,null,4]
解释:这不是唯一的正确答案,[3,1,4,null,2,null,null] 也是一个可行的构造方案。

A:
看着这个题标记的“中等”,我死活也不相信要去手撕AVL旋转……
所以我使用了广大人民都会使用的,中序转数组转平衡二叉树。

    private ArrayList<Integer> in;

    public TreeNode balanceBST(TreeNode root) {
        if (root == null || (root.left == null && root.right == null))
            return root;
        in = new ArrayList<>();
        inorder(root);
        TreeNode res = createTree(in, 0, in.size() - 1);
        return res;
    }

    private TreeNode createTree(ArrayList<Integer> in, int start, int end) {//创建平衡二叉搜索树
        if (start > end)
            return null;
        else if (start == end)
            return new TreeNode(in.get(start));
        else {
            int mid = (start + end) / 2;
            TreeNode root = new TreeNode(in.get(mid));
            root.left = createTree(in, start, mid - 1);
            root.right = createTree(in, mid + 1, end);
            return root;
        }
    }

    private void inorder(TreeNode root) {//中序遍历
        if (root == null)
            return;
        inorder(root.left);
        in.add(root.val);
        inorder(root.right);
    }

如果真的需要有手撕的需要,请移步:手撕AVL树,我不管,我就是要旋转
(找时间撕一遍。)

猜你喜欢

转载自www.cnblogs.com/xym4869/p/12760304.html