首先應當構建二叉樹中序遍歷數組,二叉樹的中序遍歷是升序的有序數組,每次經過選取二叉樹中序遍歷數組的中間位置元素爲根結點,這樣二叉樹的左右子樹高度差不會超過1,左右子樹的元素分別位於根結點的左右兩邊,而後遞歸構建二叉平衡樹便可。java
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ import java.util.*; class Solution { List<Integer> list = new ArrayList<Integer>(); public TreeNode balanceBST(TreeNode root) { getTree(root); return helper(0,list.size()-1); } public void getTree(TreeNode root){//中序遍歷的結果爲升序 if(root.left!=null) getTree(root.left); //獲取左子樹 list.add(root.val);//獲取根結點 if(root.right!=null) getTree(root.right);//獲取右子樹 } public TreeNode helper(int left,int right){ if(left>right)return null; int mid=(left+right)/2;//以中間位置元素創建二叉樹 TreeNode root=new TreeNode(list.get(mid)); root.left=helper(left,mid-1); root.right=helper(mid+1,right); return root; } }