美文网首页
树——二叉查找树BST(未完)

树——二叉查找树BST(未完)

作者: 长青之木 | 来源:发表于2018-06-02 09:39 被阅读12次

学习资料

推荐Mark Allen Weiss著作的《Data Structures and Algorithm Analysis in C》,讲解详细,重要的是书中的sample代码精巧。

代码

代码来自上书,也可以从网上下载,添加了少量个人理解的注释。

  1. 在工程中,一般将结构体和函数的定义放在.c文件里,而将声明放在.h头文件里。
  2. 利用typedef定义同一个变量类型的不同名称。

fatal.h

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

#define Error( Str )        FatalError( Str )
#define FatalError( Str )   fprintf( stderr, "%s\n", Str ), exit( 1 )

tree.h

typedef int ElementType;

/* START: fig4_16.txt */
#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_H */

/* END */

tree.c

#include "tree.h"
#include <stdlib.h>
#include "fatal.h"

struct TreeNode {
    ElementType Element;
    SearchTree  Left;
    SearchTree  Right;
};

/* START: fig4_17.txt */
SearchTree MakeEmpty( SearchTree T ) {
    if( T != NULL ) {
        MakeEmpty( T->Left );
        MakeEmpty( T->Right );
        free( T );
    }
    return NULL;
}
/* END */

/* START: fig4_18.txt */
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;
}
/* END */

/* START: fig4_19.txt */
Position FindMin( SearchTree T ) {
    if( T == NULL )
        return NULL;
    else if( T->Left == NULL )  //  T是最左子节点,符合return的条件。
        return T;
    else
        return FindMin( T->Left );
}
/* END */

/* START: fig4_20.txt */
Position FindMax( SearchTree T ) {
    if( T != NULL )
        while( T->Right != NULL )   //  T不是最右节点。
            T = T->Right;           //  T指向右子节点。

    return T;
}
/* END */

/* START: fig4_22.txt */
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!! */
}
/* END */

/* START: fig4_25.txt */
/* 删除子树T中的元素,并返回子树T的新的根节点。  */
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 );
    else  /* Found element to be deleted */
        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 */ //  删除之后,子树T新的根节点为左/右子树。
            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;
}
/* END */

ElementType Retrieve( Position P ) {
    return P->Element;
}

testtree.c

#include "tree.h"
#include <stdio.h>

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\n", 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\n", i );
    for( i = 0; i < 50; i += 2 )
        if( ( P = Find( i, T ) ) != NULL )
            printf( "Error at %d\n", i );

    printf( "Min is %d, Max is %d\n", Retrieve( FindMin( T ) ),
            Retrieve( FindMax( T ) ) );

    return 0;
}

未完

相关文章

  • B-树、B+树、B*树、LSM树优缺点比较

    动态查找树主要有二叉查找树(Binary Search Tree,BST),平衡二叉查找树(Balanced Bi...

  • 二叉查找树

    1)二叉查找树是什么?2)二叉查找树的插入、删除、查找?3)Go代码实现 一、二叉查找树是什么?二叉查找树(BST...

  • 查找树

    查找树 sschrodinger 2019/08/16 二叉查找树 二叉查找树(BST)是一棵二叉树,其中每一个节...

  • 高级数据结构和算法4:BST(二叉搜索树)、AVL树(平衡二叉树

    visualgo.net BST AVL 1. 二叉查找树 二叉查找树(Binary Search Tree),又...

  • 红黑树

    详见: 漫画:什么是红黑树 一. 二叉查找树(BST) A. 原理: 二叉排序树又称二叉查找树,也称二叉搜索树。 ...

  • 数据结构:二叉查找树C++实现

    (一) 什么是二叉查找树 二叉查找树,也叫二叉搜索树,英文是Binary Search Tree,简称BST,它是...

  • 算法 - 二叉搜索树

    二叉搜索树 查找 BST 中的某个元素 从有序数组构造一个二叉查找树 往 BST 中插入元素 BST 转成有序数组...

  • 红黑树笔记

    红黑树笔记 红黑树是平衡二叉查找树的一种。为了深入理解红黑树,我们需要从二叉查找树开始讲起。 BST 二叉查找树(...

  • 树——二叉查找树BST(未完)

    学习资料 推荐Mark Allen Weiss著作的《Data Structures and Algorithm ...

  • 红黑树深入剖析及Java实现(转)

    红黑树是平衡二叉查找树的一种。为了深入理解红黑树,我们需要从二叉查找树开始讲起。 BST 二叉查找树(Binary...

网友评论

      本文标题:树——二叉查找树BST(未完)

      本文链接:https://www.haomeiwen.com/subject/monlsftx.html