题目描述
原题链接:108. 将有序数组转换为二叉搜索树
解题思路
为了构建平衡二叉搜索树,可采用二分的方式,构建一个二分查找搜索树。因此,本题的关键就在于切割点,划分出左右区间,然后继续向下进行切割。思路类似于 106. 从中序与后序遍历序列构造二叉树(递归法) ,因为传入的是有序数组,因此本题的切割点时有序数组的中间值,左侧为左区间,右侧右区间。
/**
* 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:
TreeNode* sortedArrayToBST(vector<int>& nums) {
int n = nums.size();
if(n == 0) return NULL;
TreeNode* root;
if(n == 1) { // vector只剩一个数时,返回这个数
root = new TreeNode(nums[0]);
} else {
root = new TreeNode(nums[n / 2]); // 取中间结点作为根节点
vector<int> leftnums(nums.begin(), nums.begin() + n / 2); // 切割左区间遍历
vector<int> rightnums(nums.begin() + n / 2 + 1, nums.end()); // 切割区间遍历
root->left = sortedArrayToBST(leftnums);
root->right = sortedArrayToBST(rightnums);
}
return root;
}
};
参考文章:108. 将有序数组转换为二叉搜索树