题目描述
给你一棵二叉搜索树,请你返回一棵 平衡后 的二叉搜索树,新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法,请你返回任意一种。
如果一棵二叉搜索树中,每个节点的两棵子树高度差不超过 1 ,我们就称这棵二叉搜索树是 平衡的 。
思路
和109题类似,先将二叉树扁平化,再每次取中点作为根节点。
代码
class Solution {
List<Integer> li = new ArrayList();
public TreeNode balanceBST(TreeNode root) {
bl( root );
return dfs( 0 , li.size()-1 );
}
public void bl( TreeNode root ){
if( root==null ) return;
bl( root.left );
li.add( root.val );
bl( root.right );
}
public TreeNode dfs( int left , int right ){
if( left > right ) return null;
else if( left==right ) return new TreeNode( li.get( left ) );
int mid = ( left + right ) / 2;
TreeNode root = new TreeNode( li.get(mid) );
root.left = dfs( left , mid-1 );
root.right = dfs( mid+1 , right );
return root;
}
}
进阶
有空的时候要仔细看一下证明过程。