• 8.二叉查找树


    fatal.h

    #include <stdio.h>
    #include <stdlib.h>
    
    #define Error(Str)        FatalError(Str)
    #define FatalError(Str)   fprintf(stderr, "%s
    ", Str), exit(1)
    

    tree.h

    typedef int ElementType;
    
    #ifndef _Tree_H
    #define _Tree_H
    
    struct TreeNode;
    typedef struct TreeNode *Position;
    typedef struct TreeNode *SearchTree;
    
    SearchTree MakeEmpty(SearchTree T);
    Position Find(ElementType X, SearchTree T);
    Position FindMin(SearchTree T);
    Position FindMax(SearchTree T);
    SearchTree Insert(ElementType X, SearchTree T);
    SearchTree Delete(ElementType X, SearchTree T);
    ElementType Retrieve(Position P);
    
    #endif  
    

    tree.c

    #include "tree.h"
    #include <stdlib.h>
    #include "fatal.h"
    
    struct TreeNode
    {
        ElementType Element;
        SearchTree  Left;
        SearchTree  Right;
    };
    
    SearchTree MakeEmpty(SearchTree T)
    {
        if (T != NULL)
        {
            MakeEmpty(T->Left);
            MakeEmpty(T->Right);
            free(T);
        }
        return NULL;
    }
    
    Position Find(ElementType X, SearchTree T)
    {
        if (T == NULL)
            return NULL;
        if (X < T->Element)
            return Find(X, T->Left);
        else if (X > T->Element)
            return Find(X, T->Right);
        else
            return T;
    }
    
    Position FindMin(SearchTree T)
    {
        if (T == NULL)
            return NULL;
        else if (T->Left == NULL)
            return T;
        else
            return FindMin(T->Left);
    }
    
    Position FindMax(SearchTree T)
    {
        if (T != NULL)
        {
            while (T->Right != NULL)
                T = T->Right;
        }
        return T;
    }
    
    SearchTree Insert(ElementType X, SearchTree T)
    {
        if (T == NULL)
        {
            /* Create and return a one-node tree */
            T = malloc(sizeof(struct TreeNode));
            if (T == NULL)
                FatalError("Out of space!!!");
            else
            {
                T->Element = X;
                T->Left = T->Right = NULL;
            }
        }
        else if (X < T->Element)
            T->Left = Insert(X, T->Left);
        else if (X > T->Element)
            T->Right = Insert(X, T->Right);
        /* Else X is in the tree already; we'll do nothing */
    
        return T;  /* Do not forget this line!! */
    }
    
    SearchTree Delete(ElementType X, SearchTree T)
    {
        Position TmpCell;
    
        if (T == NULL)
            Error("Element not found");
        else if (X < T->Element)  /* Go left */
            T->Left = Delete(X, T->Left);
        else if (X > T->Element)  /* Go right */
            T->Right = Delete(X, T->Right);
    
        /* Found element to be deleted */
        else if (T->Left && T->Right)  /* Two children */
        {
            /* Replace with smallest in right subtree */
            TmpCell = FindMin(T->Right);
            T->Element = TmpCell->Element;
            T->Right = Delete(T->Element, T->Right);
        }
        else  /* One or zero children */
        {
            TmpCell = T;
            if (T->Left == NULL) /* Also handles 0 children */
                T = T->Right;
            else if (T->Right == NULL)
                T = T->Left;
            free(TmpCell);
        }
    
        return T;
    }
    
    ElementType Retrieve(Position P)
    {
        return P->Element;
    }
    

    testtree.c

    #include "tree.h"
    #include <stdio.h>
    
    int main()
    {
        SearchTree T;
        Position P;
        int i;
        int j = 0;
    
        T = MakeEmpty(NULL);
        for (i = 0; i < 50; i++, j = (j + 7) % 50)
            T = Insert(j, T);
        for (i = 0; i < 50; i++)
            if ((P = Find(i, T)) == NULL || Retrieve(P) != i)
                printf("Error at %d
    ", i);
    
        for (i = 0; i < 50; i += 2)
            T = Delete(i, T);
    
        for (i = 1; i < 50; i += 2)
            if ((P = Find(i, T)) == NULL || Retrieve(P) != i)
                printf("Error at %d
    ", i);
        for (i = 0; i < 50; i += 2)
            if ((P = Find(i, T)) != NULL)
                printf("Error at %d
    ", i);
    
        printf("Min is %d, Max is %d
    ", Retrieve(FindMin(T)),
            Retrieve(FindMax(T)));
    
        return 0;
    }
    
  • 相关阅读:
    A+B for Input-Output Practice (VIII)
    A+B for Input-Output Practice (VI)
    A+B for Input-Output Practice (VII)
    A+B for Input-Output Practice (IV)
    1.1.4 A+B for Input-Output Practice (V)
    1.1.3 A+B for Input-Output Practice (III)
    基础练习 龟兔赛跑预测
    基础练习 回形取数
    Python实用黑科技——以某个字段进行分组
    Python黑科技神奇去除马赛克
  • 原文地址:https://www.cnblogs.com/typewriter/p/6222974.html
Copyright © 2020-2023  润新知