108. 将有序数组转换为二叉搜索树
题意:
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 高度平衡 二叉搜索树。
高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。
示例 1:
输入:nums = [-10,-3,0,5,9]
输出:[0,-3,9,-10,null,5]
解释:[0,-10,5,null,-3,null,9] 也将被视为正确答案:
示例 2:
输入:nums = [1,3]
输出:[3,1]
解释:[1,3] 和 [3,1] 都是高度平衡二叉搜索树。
解题思路:
因为题目说明数组是有序的,而且需要平衡.那么根节点就一定是中间节点(左右结点数相差1),这是递归思想
问 答 **递归结束条件 ** 因为每次都是分数组,只要数组的个数是0,就返回空. 如果是1,那么就直接返回这个值的节点即可 单层递归 获得数组的中间值,然后用这个值建一个节点,以该位置分为左右数组(不包含本身).然后以相同的方式递归创建左右孩子节点 因为数组是有序的,所有可以这样完成.因为左右要平衡,所有一定是每次都取中间节点.这样左右的个数才相差1;递归就完成该题
代码:
/**
* 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) {
//如果数组个数为0,说明这边是空节点
if (nums.size() == 0)
return nullptr;
//如果个数为1,不需要继续分了.就返回这个值的节点即可
if (nums.size() == 1)
return new TreeNode(nums[0]);
//取中间值
int n = nums.size() / 2;
//新建一个中间值的节点
TreeNode *root = new TreeNode(nums[n]);
//分左右两个数组
vector<int>left(nums.begin(), nums.begin() + n);
vector<int>right(nums.begin() + n + 1, nums.end());
//递归创建孩子
root->left = sortedArrayToBST(left);
root->right = sortedArrayToBST(right);
//返回节点
return root;
}
};
总结
因为题目提示说是平衡,左右相差不大于1.所有能立即想到中间值来创建.以为是树,所以想到递归.这道题就完成了.