将有序数组转换成二叉搜索树
描述
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定有序数组: [-10,-3,0,5,9],
一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树:
0
/ \
-3 9
/ /
-10 5
思路和代码
对于一个序列,可以生成的二叉搜索树不是唯一的。所以为了平衡,每次都从中间开始划分。
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
return convert(nums, 0, nums.size());
}
TreeNode* convert(vector<int>& nums, int start, int end){
if(start == end)
return NULL;
int mid = (start + end) >> 1;
TreeNode* root = new TreeNode(nums[mid]);
root->left = convert(nums, start, mid);
root->right = convert(nums, mid+1, end);
return root;
}
};
将有序列表转换成二叉搜索树
不同于上一题,只是将数组改为了链表,要知道,数组是可以随机访问的,所以O(1)的时间就可以访问到中间的点,而链表不可以,也只有这一点不同,设置快慢指针。
class Solution {
public:
ListNode* findMidNode(ListNode* head)
{
ListNode* pre = NULL;
ListNode* slow = head;
ListNode* fast = head;
while(fast!=NULL && fast->next!=NULL)
{
pre = slow;
slow = slow->next;
fast = fast->next->next;
}
if(pre!=NULL)
pre->next = NULL;
return slow;
}
TreeNode* sortedListToBST(ListNode* head) {
if(head == NULL)
return NULL;
ListNode* mid = findMidNode(head);
TreeNode* root = new TreeNode(mid->val);
if(head == mid)
return root;
root->left = sortedListToBST(head);
root->right = sortedListToBST(mid->next);
return root;
}
};