题目:
- 给你一个整数数组
nums
,其中元素已经按 升序 排列,请你将其转换为一棵
平衡 二叉搜索树。
示例:
- 输入: n u m s = [ − 10 , − 3 , 0 , 5 , 9 ] nums = [-10,-3,0,5,9] nums=[−10,−3,0,5,9]
- 输出: [ 0 , − 3 , 9 , − 10 , n u l l , 5 ] [0,-3,9,-10,null,5] [0,−3,9,−10,null,5]
解题思路:(递归)
-
确定递归函数的参数和返回值:
需要返回TreeNode
,因为要构造二叉树,需要由root->left
或root->right
接收。TreeNode* dfs(vector<int>& nums, int left, int right)
-
确定终止条件:
划分区间后,若left > right
,代表走到了空节点,直接返回NULL
。if(left > right) return NULL;
-
确定单层递归的逻辑:
根据数组中间值来划分区间,递归左右区间。int mid = left + ((right - left) / 2); TreeNode* root = new TreeNode(nums[mid]); root->left = dfs(nums, left, mid - 1); root->right = dfs(nums, mid + 1, right); return root;
C++版整体代码
class Solution {
public:
TreeNode* dfs(vector<int>& nums, int left, int right){
if(left > right) return NULL;
int mid = left + ((right - left) / 2);
TreeNode* root = new TreeNode(nums[mid]);
root->left = dfs(nums, left, mid - 1);
root->right = dfs(nums, mid + 1, right);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
return dfs(nums, 0, nums.size() - 1);
}
};