【问题标题】:Convert linked list into binary search tree?将链表转换为二叉搜索树?
【发布时间】:2011-03-30 21:20:00
【问题描述】:

给定一个循环双向链表...如何将其转换为二叉搜索树..

问题位于 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;
}

【问题讨论】:

  • 在“循环双向链表”的中间?想一想……
  • 需要对原始头部的引用并确保左右不相等o.O
  • 另外,我猜你窒息意味着你的程序因堆栈溢出而崩溃。
  • 嘿!你是说中位数吗?或者你的意思是什么意思?要不然是啥?我不是故意的。
  • @pmg - 我正在尝试相同的逻辑,在链表的中间......但无法弄清楚递归步骤。你能帮忙吗...

标签: c algorithm data-structures


【解决方案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;
}

【讨论】:

  • 我假设列表没有排序,所以每个元素都在 O(log n) 时间内插入到树中。
  • 列表已排序......并且必须完成,不使用额外的内存......只需使用指针进行调整,这是可以实现的。我正在尝试弄清楚...阅读我在问题中发布的 URL,您会有所了解...
  • 我已经更新了我的代码,检查一下。它在 O(n log n) 中再次工作,但没有额外的内存。
猜你喜欢
  • 2017-03-30
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多