树数据结构(level_order)

时间:2016-01-04 11:42:06

标签: c data-structures tree

我正在学习关于preorderpostorderinorderlevel_order的树数据结构。这些代码由C编写。当我在出列方法中将temp -> item分配给元素项时,请进行错误。但我认为struct指针可以保存另一个struct指针!我该怎么解决呢?

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct QueueNode {
    int item;
    struct QueueNode *link; 
} QueueNode;
typedef struct {
    QueueNode *front, *rear;
} QueueType;

typedef struct TreeNode {
    int data;
    struct TreeNode *left, *right;
} TreeNode;

typedef TreeNode * element;


void error(char *message)
{
fprintf(stderr,"%s\n",message);
exit(1);
}


void init(QueueType *q)
{
    q->front = q->rear = 0;
}

int is_empty(QueueType *q)
{
    return (q->front==NULL);
}

int is_full(QueueType *q)
{
    return 0;
}

void enqueue(QueueType *q, element item)
{ 
    QueueNode *temp=(QueueNode *)malloc(sizeof(QueueNode)); 
    if(temp == NULL )
        error("error");
    else {
        temp->item = item;
        temp->link = NULL;
        if( is_empty(q) ){
            q->front = temp;
            q->rear = temp;     
        }
        else {
            q->rear->link = temp;
            q->rear = temp; 
        }   
    }
}

element dequeue(QueueType *q) 
{ 
    QueueNode *temp = q -> front;
    element item; 
    if( is_empty(q) )
        error("error");
    else {
        item = temp->item;
        q->front = q->front->link;
        if( q->front == NULL )
        q->rear = NULL;
        free(temp);
        return item;
    }
} 


void level_order(TreeNode *ptr)
{
    QueueType q;

    init(&q);
    if( !ptr ) return;
    enqueue(&q, ptr);
    while(is_empty(&q)) {
        ptr = dequeue(&q);
        printf(" %d ", ptr->data);
        if( ptr->left )
            enqueue(&q, ptr->left);
        if( ptr->right )
            enqueue(&q, ptr->right);
    }
}

TreeNode n1={1,  NULL, NULL};
TreeNode n2={2,  &n1,  NULL};
TreeNode n3={4, NULL,  NULL};
TreeNode n4={8, NULL, NULL};
TreeNode n5={10, NULL, NULL};
TreeNode n6={6, NULL, NULL};
TreeNode n7={9, &n4,  &n5};
TreeNode n8={7, &n6, &n7};
TreeNode n9={3, &n2,  &n3};
TreeNode n10={5, &n9,  &n8};
TreeNode *root= &n10;



void main()
{
    level_order(root);

}

3 个答案:

答案 0 :(得分:2)

在您的函数dequeue中,此作业 -

item = temp->item;

item是指向结构TreeNode的指针,但temp->item是一个整数变量。编译器显然会出错(并不知道你想要完成什么)。

答案 1 :(得分:1)

您正尝试将结构temp->item的成员分配到出列中的结构item,并将结构item分配给结构{{1}的成员在入队中。

Dequeue:此处返回类型 int ,将返回类型元素更改为 int ({{1这个陈述不正确)。所以这是正确的出列方式。

temp->item

入队:使用此函数进行入队(item = temp->item;此声明不正确):

int  dequeue(QueueType *q) 
{ 
    QueueNode *temp = q -> front;
    element item; 
    if( is_empty(q) )
        error("error");
    else {
        item->data = temp->item;
        q->front = q->front->link;
        if( q->front == NULL )
        q->rear = NULL;
        free(temp);
        return item;
    }
} 

答案 2 :(得分:0)

这是出列的正确方法:

int dequeue(QueueType *q)
{
    QueueNode *temp = q -> front;
    int item;
    if( is_empty(q) )
        error("error");
    else {
        item = temp->item;
        q->front = q->front->link;
        if( q->front == NULL )
            q->rear = NULL;
        free(temp);
        return item;
    }

    return 0;
}

您应返回的数据类型为int