TreeNode *sortedListToBST(ListNode *head) {
     int len=0;
     for(ListNode *p=head;p!=NULL;p=p->next) len++;
     return sortedListToBST(head, 0, len-1);
 }
    TreeNode *sortedListToBST(ListNode *head) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        //return NULL;
        
        if (head == NULL)
            return NULL;
        
        int len = 0;
        ListNode * tmp = head;
        while(tmp != NULL)
        {
            len++;
            tmp = tmp->next;
        }
        
        tmp = head;
        TreeNode * treehead = (TreeNode*) malloc(sizeof(TreeNode));
        
        if (len == 1)
        {
            treehead->val = tmp->val;
            treehead->left = NULL;
            treehead->right = NULL;
            return treehead;
        }
        
        
        if (len == 2)
        {
            TreeNode * treeright  = new TreeNode(tmp->val);
            treehead->val = tmp->next->val;
            //treeright->val = tmp->val;
            treehead->left = treeright;
            treehead->right = NULL;
            return treehead;
        }
        
        if (len == 3)
        {
            // bug here, should new
            TreeNode * treeright  = new TreeNode(tmp->val);
            TreeNode * treeleft  = new TreeNode(tmp->next->next->val);
            treehead->val  = tmp->next->val;
            
            treehead->left = treeright;
            treehead->right  = treeleft;
            return treehead;            
        }


        int mid = len/2;
        ListNode * lright = head;
        ListNode * lleft = NULL;
        
        TreeNode * tright = NULL;
        TreeNode * tleft = NULL;
        
        //                   // bug here, not malloc
        TreeNode * thead = (TreeNode * ) malloc(sizeof(TreeNode));
        
        int i=0;
        tmp = head;
        // bug here -1
        while(i < mid-1)
        {
            tmp = tmp->next;
            i++;
        }
        
        thead->val = tmp->next->val;
        
        lleft = tmp->next->next;
        tleft = sortedListToBST(lleft);
        
        tmp->next = NULL;
        tright = sortedListToBST(lright);
        
        thead->left = tright;
        thead->right = tleft;
        
        return thead;
           
            
    }
    TreeNode* sortedListToBST(ListNode* head) {

        if(head == NULL)
            return NULL;

        ListNode *r1 = head, *r2 = head;
        TreeNode* root;

        while(r2 != NULL && r2->next != NULL)
        {
            r1 = r1->next;
            r2 = r2->next->next;
        }
        root = new TreeNode(r1->val);
        root->val = r1->val;

        ListNode* Left = NULL,*temp=NULL,*temp2 = head;


        while(temp2 != r1)
        {

            if(temp == NULL)
            {
                temp = new ListNode(temp2->val);
                temp->val = temp2->val;
                Left = temp;
                temp->next = NULL;
                temp2 = temp2->next;
            }
            else
            {
                temp->next = new ListNode(temp2->val);
                temp = temp->next;
                temp->val = temp2->val;
                temp->next = NULL;
                temp2 = temp2->next;
            }
        }

        root->left = sortedListToBST(Left);

        ListNode* Right=NULL;
        temp = NULL;
        temp2 = r1->next;

        while(temp2 != NULL)
        {
            if(temp == NULL)
            {
                temp = new ListNode(temp2->val);
                temp->val = temp2->val;
                Right = temp;
                temp->next = NULL;
                temp2 = temp2->next;
            }
            else
            {
                temp->next = new ListNode(temp2->val);
                temp = temp->next;
                temp->val = temp2->val;
                temp->next = NULL;
                temp2 = temp2->next;
            }
        }

        root->right = sortedListToBST(Right);

        return root;
    }
Esempio n. 4
0
struct TreeNode* sortedListToBST(struct ListNode* head) {

    struct TreeNode*  root;

    struct ListNode *slow,*fast,*middle,*prev=NULL,*right;

    

    slow=head;

    fast=head;

    

    if(head==NULL)

        return NULL;

    

    while(slow && fast)

    {

        if(fast->next == NULL)

        {

            middle = slow;

            break;

        }

        

        if(fast->next->next == NULL)

        {

            middle=slow;

            break;

        }

        

        prev = slow;

        slow = slow->next;

        fast = fast->next->next;

        

    }

    

    if(prev)

        prev->next=NULL;

    else

        head=NULL;

        

    right = middle->next;

        

    

    root=(struct TreeNode*)malloc(sizeof(struct TreeNode));

    root->val = middle->val;
	printf("\n## %d",root->val);

    root->left=sortedListToBST(head);
	if(root->left)
	printf(" ## %d",root->left->val);

    root->right=sortedListToBST(right);
	if(root->right)
	printf("## %d\n",root->right->val);

    return root;

    

}
        void Main()
        {
			ListNode* list = createList({1, 2, 3, 4, 5});
			print(sortedListToBST(list));
        }
 TreeNode *sortedListToBST(ListNode *head) {
     curItem = head;
     int listsize = getListSize(head);
     return sortedListToBST(listsize);
 }