# LC 1382. Balance a Binary Search Tree
### [Problem link](https://leetcode.com/problems/balance-a-binary-search-tree/)
###### tags: `leedcode` `python` `c++` `medium` `BST`
Given the <code>root</code> of a binary search tree, return a **balanced** binary search tree with the same node values. If there is more than one answer, return **any of them** .
A binary search tree is **balanced** if the depth of the two subtrees of every node never differs by more than <code>1</code>.
**Example 1:**
<img alt="" src="https://assets.leetcode.com/uploads/2021/08/10/balance1-tree.jpg" style="width: 500px; height: 319px;" />
```
Input: root = [1,null,2,null,3,null,4,null,null]
Output: [2,1,3,null,null,null,4]
Explanation: This is not the only correct answer, [3,1,4,null,2] is also correct.
```
**Example 2:**
<img alt="" src="https://assets.leetcode.com/uploads/2021/08/10/balanced2-tree.jpg" style="width: 224px; height: 145px;" />
```
Input: root = [2,1,3]
Output: [2,1,3]
```
**Constraints:**
- The number of nodes in the tree is in the range <code>[1, 10<sup>4</sup>]</code>.
- <code>1 <= Node.val <= 10<sup>5</sup></code>
## Solution 1
#### Python
```python=
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def balanceBST(self, root: TreeNode) -> TreeNode:
arr = []
def traversal(node) -> None:
if not node:
return
traversal(node.left)
arr.append(node.val)
traversal(node.right)
traversal(root)
def arr2BST(arr) -> TreeNode:
if not arr:
return None
mid = len(arr) // 2
head = TreeNode(arr[mid])
head.left = arr2BST(arr[:mid])
head.right = arr2BST(arr[mid + 1:])
return head
BST_root = arr2BST(arr)
return BST_root
```
#### C++
```cpp=
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void Inorder(TreeNode *node, vector<int>& v) {
if (node == nullptr) {
return;
}
Inorder(node->left, v);
v.push_back(node->val);
Inorder(node->right, v);
}
TreeNode* Build(vector<int>& v, int left, int right) {
if (left > right) {
return nullptr;
}
int mid = left + (right - left) / 2;
TreeNode *cur = new TreeNode(v[mid]);
cur->left = Build(v, left, mid - 1);
cur->right = Build(v, mid + 1, right);
return cur;
}
TreeNode* balanceBST(TreeNode* root) {
vector<int> v;
Inorder(root, v);
return Build(v, 0, v.size() - 1);
}
};
```
>### Complexity
>n = The number of nodes in the tree
>| | Time Complexity | Space Complexity |
>| ----------- | --------------- | ---------------- |
>| Solution 1 | O(n) | O(n) |
## Note
sol1:
traversal: TC(n), SC(n)
arr2BST: TC(n), SC(n)
total complexity: TC(n), SC(n)
Ref:
[Binary Tree Inorder Traversal (Recursive/Iteration)](https://hackmd.io/@Alone0506/HJqe9Qyra)
[LC 108. Convert Sorted Array to Binary Search Tree](https://hackmd.io/@Alone0506/HyxoauJnn)