【问题标题】:Making a linked list from a binary tree using Preorder Traversal使用前序遍历从二叉树创建链表
【发布时间】:2012-12-26 17:50:34
【问题描述】:

我想在二叉树上进行前序遍历时将元素添加到链接列表。我不想破坏BT,只是复制一个链表中的元素。这是我的代码 sn-p。

void Preorder(treeNode *node, Nodelist * head){
    if(node==NULL){
        return;
    }
    //printf("%d\n", node->data);
    head = List_insert(head, node->data);
    Preorder(node->left, head);
    Preorder(node->right, head);
}

Nodelist * List_insert(Nodelist * head, int v)
{
    Nodelist * p = Node_construct(v);
    p->depth = 2222;
    p -> next = head;
    return p;
}

void List_print(Nodelist * head)
{
    while (head != NULL)
    {
        printf("%d ", head -> value);
        printf("%d ", head -> depth);
        printf("\n");
        head = head -> next;
    }
    printf("\n\n");
}

treeNode * Insert(treeNode *node,int data)
{
        if(node==NULL)
        {
                treeNode *temp;
                temp = (treeNode *)malloc(sizeof(treeNode));
                temp -> data = data;
                temp -> left = temp -> right = NULL;
                return temp;
        }

        if(data >(node->data))
        {
                node->right = Insert(node->right,data);
        }
        else if(data < (node->data))
        {
                node->left = Insert(node->left,data);
        }
        return node;

}

int main(int argc, char**argv) {
        treeNode *root = NULL;
        root = Insert(root, 14);
        root = Insert(root, 15);
        root = Insert(root, 4);
        root = Insert(root, 9);
        root = Insert(root, 7);
        root = Insert(root, 18);
        root = Insert(root, 3);
        root = Insert(root, 5);
        root = Insert(root, 16);
        root = Insert(root, 20);
        root = Insert(root, 17); 

        Nodelist * head = NULL;
        Preorder(root, head);
        List_print(head);

    return 0;
}

上面的代码什么也没打印。我认为问题在于使用 head = List_insert(head, node->data);在预购功能中。任何帮助都将不胜感激。

【问题讨论】:

  • 我认为问题也在List_insert..
  • 如果你想将你的 BST 修改为 Linked list 然后按后缀顺序遍历,但那是另一回事..

标签: c linked-list binary-tree preorder


【解决方案1】:

您将NULL 作为列表头传递给预购。这是按值传递的,您不能以这种方式更改主函数中的头部。而是像这样定义 Preorder:

void Preorder(treeNode *node, Nodelist **head)

这样你就可以做到:

*head = Linst_insert....

在函数里面修改列表。当然,你需要像这样从main函数调用preorder:

Preorder(root, &head);

【讨论】:

    【解决方案2】:

    试试这个...希望有帮助

    Nodelist *Preorder(treeNode *node, Nodelist ** tail) { // use name 'tail' instead of 'head' because you are inserting on the tail, but this functions returns head..
    
        Nodelist *head;
    
        if(node==NULL){
            return;
        }
        //printf("%d\n", node->data);
        head = List_insert(tail, node->data);
        Preorder(node->left, tail);
        Preorder(node->right, tail);
        return head;
    }
    
    Nodelist * List_insert(Nodelist ** tail, int v)
    {
        Nodelist * p = Node_construct(v);
        p->depth = 2222;
        p->next = NULL;
        if (!tail) {
            *tail = p;  // (*tail) is NULL, true when first time List_Insert called
        }
        else {
            (*tail)->next = p;
        }
        return p;
    }
    
    int main(int argc, char**argv) {
            treeNode *root = NULL;
            root = Insert(root, 14);
            root = Insert(root, 15);
            root = Insert(root, 4);
            root = Insert(root, 9);
            root = Insert(root, 7);
            root = Insert(root, 18);
            root = Insert(root, 3);
            root = Insert(root, 5);
            root = Insert(root, 16);
            root = Insert(root, 20);
            root = Insert(root, 17); 
    
            Nodelist * head = NULL;
            head = Preorder(root, &head);
            List_print(head);
    
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-23
      • 2021-03-08
      • 2011-07-09
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多