题目
二叉搜索树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树; 那么又如何满足高度平衡呢?每次都以中位数作为结点即可!
方法一:
偷懒的方法,将链表遍历一遍,得到数组; 在数组中用二分法来找中位数:
class Solution {
public:
TreeNode* sortedListToBST(ListNode* head) {
vector<int> nums;
while(head!=NULL){
nums.push_back(head->val);
//cout<<head->val;
head = head->next;
}
return create(nums,0,nums.size()-1);
}
TreeNode* create(vector<int> &nums,int left,int right){
if(left>right)
return NULL;
int mid = (left+right)/2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = create(nums,left,mid - 1);
root->right = create(nums,mid+1,right);
return root;
}
};
方法二:
用快慢指针的方法来找链表的中间结点,注意要做成左闭右开的方式,这样在找到mid节点后方便后续参数设置!
对于这种二分法的区间开闭问题可以划分为:左闭右闭,和左闭右开
左闭右闭:
[left,right], mid = (left+right)/2 ----> 左:[left,mid-1], 右:[mid+1,right]
左闭右开:
[left,right)(这个里的右开right是右边界后一位), mid = (left+right)/2 ----->左:[left,mid), 右:[mid+1,right)
class Solution {
public:
ListNode* getMid(ListNode* left, ListNode* right)
{
ListNode* slow;
ListNode* fast;
slow = fast = left;
while(fast!=right&&fast->next!=right)
{
slow = slow->next;
fast = fast->next;
fast = fast->next;
}
return slow;
}
TreeNode* sortedListToBST(ListNode* head) {
return create(head,NULL);
//right设为NULL,即右开
}
TreeNode* create(ListNode* left,ListNode* right)
{
if(left == right)
return NULL;
ListNode* mid = getMid(left,right);
TreeNode* root = new TreeNode(mid->val);
root->left = create(left,mid);
root->right = create(mid->next,right);
return root;
}