-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconvert-sorted-array-to-binary-search-tree.h
41 lines (33 loc) · 1.45 KB
/
convert-sorted-array-to-binary-search-tree.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#ifndef CONVERT_SORTED_ARRAY_TO_BINARY_SEARCH_TREE_H_
#define CONVERT_SORTED_ARRAY_TO_BINARY_SEARCH_TREE_H_
#include <vector>
#include "tree-node.h"
namespace solution {
TreeNode* sortedArrayToBST(std::vector<int>& nums,
const std::vector<int>::const_iterator& begin,
const std::vector<int>::const_iterator& end) {
if (end - begin > 2) {
auto mid = (end - begin) / 2;
return new TreeNode(*(begin + mid),
sortedArrayToBST(nums, begin, begin + mid),
sortedArrayToBST(nums, begin + mid + 1, end));
} else if ((end - begin) == 2) {
return new TreeNode(*(begin + 1), new TreeNode(*begin), nullptr);
}
return new TreeNode(*begin);
}
TreeNode* sortedArrayToBST(std::vector<int>& nums) {
// Divide and conquer
// Runtime: 8 ms, faster than 95.28% of C++ online submissions for Convert Sorted Array to Binary Search Tree.
// Memory Usage: 21.4 MB, less than 46.31% of C++ online submissions for Convert Sorted Array to Binary Search Tree.
//
if (nums.size() == 0) return nullptr;
if (nums.size() == 1) return new TreeNode(nums[0]);
if (nums.size() == 2)
return new TreeNode(nums[1], new TreeNode(nums[0]), nullptr);
if (nums.size() == 3)
return new TreeNode(nums[1], new TreeNode(nums[0]), new TreeNode(nums[2]));
return sortedArrayToBST(nums, nums.cbegin(), nums.cend());
}
}
#endif // CONVERT_SORTED_ARRAY_TO_BINARY_SEARCH_TREE_H_