zoukankan      html  css  js  c++  java
  • 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;
    }
    
  • 相关阅读:
    MySQL 存储引擎 (一)
    mssql sqlserver if exists 用法大汇总
    mssql sqlserver 使用sql脚本实现相邻两条数据相减的方法分享
    mssql sqlserver 使用sql脚本获取字符串存在多少个网址(url地址)的方法分享
    mssql sqlserver sql脚本自动遍历重复生成指定表记录
    mssql sqlserver 使用sql脚本剔除数据中的tab、空格、回车等特殊字符的方法分享
    mssql sqlserver 使用SSMS运行sql脚本的六种方法分享
    mssql sqlserver isnull coalesce函数用法区别说明
    C# 当前 .NET SDK 不支持将 .NET Core 2.1 设置为目标。请将 .NET Core 2.0 或更低版本设置为目标,或使用支持 .NET Core 2.1 的 .NET SDK 版本。
    mssql sqlserver 三种数据表数据去重方法分享
  • 原文地址:https://www.cnblogs.com/typewriter/p/6222974.html
Copyright © 2011-2022 走看看