|
| 1 | +package com.fishercoder.solutions; |
| 2 | + |
| 3 | +import com.fishercoder.common.classes.TreeNode; |
| 4 | + |
| 5 | +import java.util.ArrayList; |
| 6 | +import java.util.List; |
| 7 | + |
| 8 | +/** |
| 9 | + * 1382. Balance a Binary Search Tree |
| 10 | + * |
| 11 | + * Given a binary search tree, return a balanced binary search tree with the same node values. |
| 12 | + * A binary search tree is balanced if and only if the depth of the two subtrees of every node never differ by more than 1. |
| 13 | + * If there is more than one answer, return any of them. |
| 14 | + * |
| 15 | + * Example 1: |
| 16 | + * Input: root = [1,null,2,null,3,null,4,null,null] |
| 17 | + * Output: [2,1,3,null,null,null,4] |
| 18 | + * Explanation: This is not the only correct answer, [3,1,4,null,2,null,null] is also correct. |
| 19 | + * |
| 20 | + * Constraints: |
| 21 | + * The number of nodes in the tree is between 1 and 10^4. |
| 22 | + * The tree nodes will have distinct values between 1 and 10^5. |
| 23 | + * */ |
| 24 | +public class _1382 { |
| 25 | + public static class Solution1 { |
| 26 | + public TreeNode balanceBST(TreeNode root) { |
| 27 | + List<Integer> inorder = inorder(root, new ArrayList<>()); |
| 28 | + return dfs(inorder, 0, inorder.size() - 1); |
| 29 | + } |
| 30 | + |
| 31 | + private List<Integer> inorder(TreeNode root, List<Integer> list) { |
| 32 | + if (root == null) { |
| 33 | + return list; |
| 34 | + } |
| 35 | + inorder(root.left, list); |
| 36 | + list.add(root.val); |
| 37 | + return inorder(root.right, list); |
| 38 | + } |
| 39 | + |
| 40 | + private TreeNode dfs(List<Integer> nums, int start, int end) { |
| 41 | + if (end < start) { |
| 42 | + return null; |
| 43 | + } |
| 44 | + int mid = (start + end) / 2; |
| 45 | + TreeNode root = new TreeNode(nums.get(mid)); |
| 46 | + root.left = dfs(nums, start, mid - 1); |
| 47 | + root.right = dfs(nums, mid + 1, end); |
| 48 | + return root; |
| 49 | + } |
| 50 | + } |
| 51 | +} |
0 commit comments