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树,我不管,我就是要旋转
(找时间撕一遍。)