持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
一、题目描述:
108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode) (leetcode-cn.com)
给你一个整数数组 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,null,3] 和 [3,1] 都是高度平衡二叉搜索树。
提示:
- 1 <= nums.length <= 10^4
- -10^4 <= nums[i] <= 10^4
- nums 按 严格递增 顺序排列
二、思路分析:
二叉搜索树就是节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。
我们首先要找到根节点,根节点就是数组最中间的值,如果是奇数就取最中间,偶数我们这里选择取中间靠左的位置,直接(left+right)/2即可,然后左边调用leftmid,右边mid+1right,递归调用即可。
三、AC 代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* helper(int left,int right,int *nums){
if(left >= right){
return NULL;
}
int midpos = 0;
midpos = (left+right)/2;
struct TreeNode *node = malloc(sizeof(struct TreeNode));
node->val = nums[midpos];
node->left = helper(left,midpos,nums);
node->right = helper(midpos+1,right,nums);
return node;
}
struct TreeNode* sortedArrayToBST(int* nums, int numsSize){
return helper(0,numsSize,nums);
}
四、参考:
一文读懂二叉搜索树(BST)、中序遍历;附Python代码讲解注释 - 将有序数组转换为二叉搜索树 - 力扣(LeetCode)