Convert Sorted Array to Binary Search Tree
Problem:
Given an array where elements are sorted in ascending order, convert it to a height balanced BST.
- Analysis:
For a height balanced BST, the root will be the nums[mid].
So we can recursively do like that [left:mid - 1][mid][mid + 1:right], [] is a BST.
- Code - Java:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode sortedArrayToBST(int[] nums) {
int len = nums.length;
if (len == 0) {
return null;
}
return helper(nums, 0, len - 1);
}
public TreeNode helper(int[] nums, int left, int right) {
if (left > right) {
return null;
}
if (left == right) {
return new TreeNode(nums[left]);
}
int mid = left + (right - left) / 2;
TreeNode node = new TreeNode(nums[mid]);
node.left = helper(nums, left, mid - 1);
node.right = helper(nums, mid + 1, right);
return node;
}
}
- Code - C++:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
int len = nums.size();
if (len == 0) {
return NULL;
}
return helper(nums, 0, len - 1);
}
TreeNode* helper(vector<int>& nums, int left, int right) {
if (left > right) {
return NULL;
}
if (left == right) {
return new TreeNode(nums[left]);
}
int mid = left + (right - left) / 2;
TreeNode* node = new TreeNode(nums[mid]);
node->left = helper(nums, left, mid - 1);
node->right = helper(nums, mid + 1, right);
return node;
}
};
- Code - Python:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def sortedArrayToBST(self, nums):
"""
:type nums: List[int]
:rtype: TreeNode
"""
numsLen = len(nums)
if numsLen == 0:
return None
return self.helper(nums, 0, numsLen - 1)
def helper(self, nums, left, right):
if left > right:
return None
if left == right:
return TreeNode(nums[left])
mid = left + (right - left) / 2
node = TreeNode(nums[mid])
node.left = self.helper(nums, left, mid - 1)
node.right = self.helper(nums, mid + 1, right)
return node
- Time Complexity: O(N), N is the length of the array nums