Build A Binary Search Tree (30)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LoverJuan/article/details/77946841

#include <stdio.h>

#include <stdlib.h>

typedef int ElementType;

typedef struct TreeNode *Tree;

typedef Tree QueueElementType;

struct TreeNode

{

    ElementType Data;

    Tree Left, Right;

};

int Count = 0;

ElementType *Key;


typedef struct queue *Queue;

typedef struct LinkedNode *LinkedList;

typedef LinkedList Position;

struct LinkedNode

{

    Tree Data;

    LinkedList Next;

};

struct queue {

    LinkedList Head;

    int Size;

    Position Rear;

    int Capacity;

};

void WriteData(Tree T);

Queue InitQueue();

int IsEmpty(Queue Q);

void EnterQueue(Tree X, Queue Q);

Tree QuitQueue(Queue Q);

int compar(const void *a, const void *b)

{

    return *((int*)a) - *((int*)b);

}

int main()

{

    int N;

    scanf("%d",&N);

    Tree T = malloc(sizeof(struct TreeNode)*N);

    int Left, Right;

    for (int i=0; i<N; i++) {

        scanf("%d %d",&Left, &Right);

        if (Left == -1) {

            T[i].Left = NULL;

        }else

        {

            T[i].Left = &T[Left];

        }

        if (Right == -1) {

            T[i].Right = NULL;

        }else

        {

            T[i].Right = &T[Right];

        }

        T[i].Data = i;

    }

    Key = malloc(sizeof(ElementType)*N);

    for (int i=0; i<N; i++) {

        scanf("%d",&Key[i]);

    }

    qsort(Key, N, sizeof(ElementType), compar);

    WriteData(T);

    Queue Q = InitQueue();

    if (T) {

        EnterQueue(T, Q);

    }

    int flag = 1;

    Tree Temp = NULL;

    while (!IsEmpty(Q)) {

        Temp = QuitQueue(Q);

        if (flag) {

            printf("%d",Temp->Data);

            flag = 0;

        }else

        {

            printf(" %d",Temp->Data);

        }

        if (Temp->Left) {

            EnterQueue(Temp->Left, Q);

        }

        if (Temp->Right) {

            EnterQueue(Temp->Right, Q);

        }

    }

    return 0;

}

void WriteData(Tree T)

{

    if (T) {

        WriteData(T->Left);

        T->Data = Key[Count++];

        WriteData(T->Right);

    }

}

Queue InitQueue()

{

    Queue Q = malloc(sizeof(struct queue));

    Q->Head = malloc(sizeof(struct LinkedNode));

    Q->Head->Next = NULL;

    Q->Size = 0;

    Q->Rear = Q->Head;

    return Q;

}

int IsEmpty(Queue Q)

{

    return Q->Size == 0;

}

void EnterQueue(Tree X, Queue Q)

{

    Position P = malloc(sizeof(struct LinkedNode));

    P->Data = X;

    P->Next = NULL;

    Q->Rear->Next = P;

    Q->Rear = P;

    Q->Size++;

}

Tree QuitQueue(Queue Q)

{

    if (IsEmpty(Q)) {

        return NULL;

    }

    Q->Size--;

    Position DeleteNode = Q->Head->Next;

    Q->Head->Next = Q->Head->Next->Next;

    if (Q->Head->Next == NULL) {

        Q->Head = Q->Rear;

    }

    return DeleteNode->Data;

}

猜你喜欢

转载自blog.csdn.net/LoverJuan/article/details/77946841