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; }
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); }