难度简单674
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -10 5
有点紧张,看到这个题目的时候我知道思路是什么,但是我不知道怎么实现,后来看了官方题解之后才知道的,还是训练得太少了。我在想的时候知道找到根节点后对左右两边数组进行遍历放进去就好了,但是题解中解法是对所有的数组元素都看做“根节点”来操作,这样就递归进行很快捷、统一,这是我在担心左右孩子的时候没有想到的解决办法。这也告诉我了,有时候在算法当中把某个事情看到更深处就是一样的事情了,也就是常说的本质的问题。还是需要多练习。
这是题解中的中序遍历方式,选择中间位置左边的作为根节点。另外的
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return helper(nums, 0, nums.size() - 1);
}
TreeNode* helper(vector<int>& nums, int left, int right){
if(left > right){
return nullptr;
}
int mid = (left + right) / 2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = helper(nums, left, mid - 1);
root->right = helper(nums, mid + 1, right);
return root;
}
};
下面这个是选择任意一个位置数字作为根节点,和上面的不同之处在于 mid 的值。
当mid = (left + right + 1)/ 2时,便是取数组中间位置右边的数字作为根节点。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return helper(nums, 0, nums.size() - 1);
}
TreeNode* helper(vector<int>& nums, int left, int right){
if(left > right){
return nullptr;
}
int mid = (left + right + rand() % 2) / 2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = helper(nums, left, mid - 1);
root->right = helper(nums, mid + 1, right);
return root;
}
};