使用队列的二进制堆

时间:2015-07-29 23:47:14

标签: c data-structures heap

通过使用数组来表示树,有很多C示例。 但是,我正在尝试使用树(节点)作为二进制堆。

  1. 我试图将孩子左,然后右。为了在Width-first-Search中插入元素,我使用了Queue。这有必要吗?

  2. 我的队列使用的是Node *而不是int类型。因为,如果我在队列中放置一个int,我必须搜索节点的位置(需要更多时间)。这是构建二进制堆的合适方法吗?

  3. 在插入过程中,有起泡和起泡。但是,因为我有一个二进制堆,也有一个Queue。我是否还必须匹配队列中的订单?

  4. 4.我是否需要像BST一样搜索插入位置?或者我是否通过使用队列直接接近地址?

    我已经学会了这个理论。但是,代码和结构并不熟悉。

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int left(int a,int b)
    {
        return (int)(a-floor((float)a/(float)b)*b);
    }
    
    typedef struct Node
    {
        int data;
        struct Node* leftNext;
        struct Node* rightNext;
    }Node;
    
    struct queue
    {
        Node** data;
        int top;
        int bottom;
        int size;
    }typedef Queue;
    
    int push(Queue* Q,Node* input)
    {
        printf("PUSH : %d\n",input);
    
        //한칸은 비울 것임.
        if(left((*Q).top-(*Q).bottom,(*Q).size)==(*Q).size-1)
        {
            printf("큐가 다 찼습니다.\n");
            return 0;
        }
        else
        {
            //큐의 크기를 넘으면 아래로 이동
            if((*Q).top==(*Q).size)
                (*Q).top=0;
    
            printf("TOP : %d\n",(*Q).top);
            (*Q).data[(*Q).top++]=input;
            return 1;
        }
    }
    
    Node* pop(Queue* Q)
    {
        if(left((*Q).top-(*Q).bottom,(*Q).size)==0)
            printf("큐가 비었습니다.\n");
        else
        {
            if((*Q).bottom==(*Q).size)
                (*Q).bottom=0;
    
            printf("BOTTOM : %d\n",(*Q).bottom);
            return (*Q).data[(*Q).bottom];
        }
    }
    
    typedef struct Heap
    {
        Node* head;
    }Heap;
    
    int insert(Node** head,int data,Queue* Q)
    {
        if((*head)!=NULL)
        {
            if((*head)->leftNext==NULL)
            {
                (*head)->leftNext=(Node*)malloc(sizeof(Node));
                (*head)->leftNext->data=data;
                (*head)->leftNext->leftNext=NULL;
                (*head)->leftNext->rightNext=NULL;
                push(Q,&(*head)->leftNext);
            }
            else if((*head)->rightNext==NULL)
            {
                (*head)->rightNext=(Node*)malloc(sizeof(Node));
                (*head)->rightNext->data=data;
                (*head)->rightNext->leftNext=NULL;
                (*head)->rightNext->rightNext=NULL;
                push(Q,&(*head)->rightNext);
                (*Q).bottom++;
            }
            else
            {
                if(insert((pop(Q)),data,Q)==1)
                    return 1;
                else
                    return 0;
            }
        }
        else
        {
            printf("헤드가 비었습니다.");
            return 0;
        }
        return 1;
    }
    
    int main()
    {
        //입력 15 6 12 7 10 17
        Heap h;
        //큐 초기화
        Queue Q;
        //큐 크기
        int temp=100;
        Q.data=(Node**)malloc(sizeof(Node*)*temp);
        Q.size=temp;
        Q.top=0;
        Q.bottom=0;
    
        h.head=(Node*)malloc(sizeof(Node));
        h.head->data=15;
        h.head->leftNext=NULL;
        h.head->rightNext=NULL;
        insert(&(h.head),6,&Q);
        insert(&(h.head),12,&Q);
        insert(&(h.head),7,&Q);
        insert(&(h.head),10,&Q);
        insert(&(h.head),17,&Q);
    
        return 0;
    }
    

0 个答案:

没有答案