给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。
如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 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] 也是一个可行的构造方案。
提示:
- 树节点的数目在
1
到10^4
之间。 - 树节点的值互不相同,且在
1
到10^5
之间。
思路:我的方法可能不是最好,因为我是先通过中序遍历得到一个有序序列,通过递归构造出绝对平衡的二叉搜索树。
class Solution {
List<Integer> list;
public TreeNode balanceBST(TreeNode root) {
if(root==null) return null;
list=new ArrayList<>();
dfs(root);
return work(new TreeNode(-1),list,0,list.size()-1);
}
private TreeNode work(TreeNode rt,List<Integer> list,int l,int r) {
if(l>r) return null;
int mid=(l+r)/2;
rt.val=list.get(mid);
rt.left=new TreeNode(-1);
rt.left=work(rt.left,list,l,mid-1);
rt.right=new TreeNode(-1);
rt.right=work(rt.right,list,mid+1,r);
if(rt.val<0) return null;
return rt;
}
private void dfs(TreeNode root) {
if(root==null) return;
dfs(root.left);
list.add(root.val);
dfs(root.right);
}
}