/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { private List<Integer> vals; public TreeNode balanceBST(TreeNode root) { vals = new ArrayList<>(); dfs(root); return build(0, vals.size() - 1); } private void dfs(TreeNode root) { if (root == null) { return; } dfs(root.left); vals.add(root.val); dfs(root.right); } private TreeNode build(int i, int j) { if (i > j) { return null; } int mid = (i + j) >> 1; TreeNode root = new TreeNode(vals.get(mid)); root.left = build(i, mid - 1); root.right = build(mid + 1, j); return root; } }