题意:给你一个已排序的vector,要求吧vector转换成二叉搜索树,且该二叉搜索树是高度平衡树。
解题思路:使用递归的办法,中间的数就是根节点,左边的一半组成左子树,右边的一半组成右子树,然后对左半vector和右半vector分别做相同的操作,直到vector为空。
时间复杂度:O(N)
空间复杂度:O(N)
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
if(nums.size() == 0)
return NULL;
TreeNode* node = new TreeNode(nums[nums.size() / 2]);
vector<int> leftvec(nums.begin(), nums.begin() + nums.size()/2);
vector<int> rightvec(nums.begin()+nums.size()/2 + 1, nums.end());
node->left = sortedArrayToBST(leftvec);
node->right = sortedArrayToBST(rightvec);
return node;
}
};
需要注意的是:
在创造节点的时候需要使用堆内存,new一个TreeNode变量,如果使用动态内存的化,当递归调用底层函数return后,内存将被收回,结果无法预知。
但是如果使用new申请堆内存,仅在程序员释放的时候才会回收内存,且val、left、right都存放在new申请的TreeNode变量堆内存中,函数return后也不会失效。