leetcode 109. Convert Sorted List to Binary Search Tree

从一个list->BST 还要height balance

解题思路: 

  • 每次找中点作为root,将中点左边的作为左子树的节点,中点右边的作为右子树的节点。

 

但是考虑树要找中间节点, 所以我最开始的思路是: 将list 转换为一个vector, 然后就可以easy的找中点和左,右两个部分了。 但是有一个数据超时了。。。

class Solution {
public:
    TreeNode * CreBST(vector<int> v, int s, int e)
    {
        if(s>e)
            return NULL;
        int mid=s+(e-s)/2;
        TreeNode * T=new TreeNode (v[mid]);
        T->left=CreBST(v,s, mid-1);
        T->right=CreBST(v,mid+1, e);
        return T;
    }
    TreeNode* sortedListToBST(ListNode* head) {
        ListNode *l=head;
        if(head==NULL)
            return NULL;
        vector<int> v;
        
        while(l)
        {
            v.push_back(l->val);
            l=l->next;
           
        }
       
      return CreBST(v,  0,  v.size()-1);
        
    }
};

 

所以不能先转换为vector。考虑直接在list 中找中点。。。

  • list 找中点, 定义两个指针, 一个是另一个的两边速度,如果快的到达了终点,慢的就刚好在中点
class Solution {
public:
    TreeNode * CreBST(ListNode * head, ListNode * Tail)
    {
        if(head==Tail)
            return NULL;
        
            
        ListNode * temp=head;
        ListNode * mid=head;
       
        while(temp!=Tail&& temp->next!=Tail)
        {
            temp=temp->next->next;
            mid=mid->next;
        }
        TreeNode * T=new TreeNode (mid->val);
        T->left=CreBST(head, mid);
        T->right=CreBST(mid->next, Tail);
        
        return T;
        
        
    }
    TreeNode * sortedListToBST(ListNode * head)
    {
        
        return CreBST(head, NULL);
        
    }

  

 

posted @ 2017-08-19 19:18  hahahaf  阅读(146)  评论(0编辑  收藏  举报