2

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

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); 在预购功能中。任何帮助都将不胜感激。

4

2 回答 2

2

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

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

这样你就可以做到:

*head = Linst_insert....

在函数内部修改列表。当然,您需要从main函数中调用 preorder ,如下所示:

Preorder(root, &head);
于 2013-01-12T04:25:02.233 回答
0

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

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;
}
于 2013-01-12T05:14:18.367 回答