2011-03-30 70 views
2

鑑於圓雙向鏈表...我怎樣才能轉換成二叉搜索樹..將鏈接列表轉換爲二叉搜索樹?

的問題是在 http://rajeevprasanna.blogspot.com/2011/02/convert-binary-tree-into-doubly-linked.html

發現我試着寫了相同的代碼,但它扼殺!請在這裏提出一些建議。另外,我怎樣才能找到鏈接列表的中間..請談談代碼(C或C++代碼),如果可能的話,小例子會很好。

通過我上面提供的文章(URL),BST到鏈接列表是一個很好的練習。我試圖按照同一原理,但我的程序哽咽......請幫助的「圓弧雙向鏈表」的...

Node ListToTree(Node head) 
{ 
    if(head == NULL) 
     return NULL; 

    Node hleft = NULL, hright = NULL; 

    Node root = head; 

    hleft = ListToTree(head->left); 
    head->left = NULL; 
    root->left = hleft; 

    hright = ListToTree(head->right); 
    head->right = NULL; 
    root->right = hright; 

    return root; 
} 
+8

中間?想想看... – pmg 2011-03-30 21:21:40

+0

需要參考原始頭部,並確保左右不等於它o.O – Joe 2011-03-30 21:24:57

+0

另外我會猜測窒息你的意思是你的程序崩潰堆棧溢出。 – Joe 2011-03-30 21:26:03

回答

1
class Node { 
    Node *prev, *next; 
    int value; 
} 

void listToTree(Node * head) { 
    if (head == null) 
     return; 
    if (head->next == head) { 
     head->prev = null; 
     head->next = null; 
     return head; 
    } 
    if (head->next->next == head) { 
     head->prev = null; 
     head->next->next = null; 
     head->next->prev = null; 
     return head; 
    } 

    Node *p1 = head, *p2 = head->prev; 
    while (p1->value < p2.value) 
     p1 = p1->next, p2 = p2->prev; 
    Node * root = p1; 
    root->prev->next = head; 
    root->next->prev = head->prev; 
    root->prev = listToTree(head); 
    root->next = listToTree(root->next); 
    return root; 
} 
+0

我假設列表沒有排序,所以每個元素都會在O(log n)時間插入到樹中。 – 2011-03-30 21:41:14

+0

List被排序......並且必須完成,而不使用額外的內存......只需調整指針,這是可以實現的。我試圖找出它......閱讀我在問題中發佈的網址,並且您會發現一個想法... – AGeek 2011-03-30 21:50:38

+0

我已更新我的代碼,請檢查此代碼。它在O(n log n)中再次工作,但沒有額外的內存。 – 2011-03-31 08:46:21