バイナリ・ソートツリーのC言語のダイナミック・ルックアップ・テーブル

ディレクトリ

静的および動的な外観のルックアップテーブルの表1の比較

2. Aバイナリ・ソートツリー(バイナリソートの木)

2.1は、2つのバイナリソートツリーを定義し

2.2 2つのバイナリソートツリー検索アルゴリズム

2.3バイナリソートツリー挿入アルゴリズム

2.4 2つのバイナリソートツリー構築アルゴリズム

削除アルゴリズム2.5バイナリソートツリー

3.ソースコード


静的および動的な外観のルックアップテーブルの表1の比較

生成された静的なルックアップテーブルたら、レコードは一般的に固定された検出プロセスに含まれています。ダイナミックルックテーブルルックアップだけでなく、データを達成するだけでなく、多くの場合、動的なルックアップテーブルは常に変化しているので、生成後にテーブルの上に挿入して、削除操作することができます。

2. Aバイナリ・ソートツリー(バイナリソートの木)

2.1は、2つのバイナリソートツリーを定義し

バイナリ・ソートの木や空のバイナリ、または以下の特性を有するバイナリツリー:

(1)左の部分木は、空のままサブツリーない場合、キー(要素)のすべてのノードが少ないルートキーの値よりもあった;右サブツリーが空でない場合、すべてのノードの右サブツリーの次にキー(要素)ルートノードのキーコード値の値よりも大きいです。

(2)は、左と右のサブツリーもバイナリ・ソートツリーです

2.2 2つのバイナリソートツリー検索アルゴリズム

ツリーを検索するには(1)が空である場合、検索が失敗しました

(2)ツリーが空でない場合、比較値xにキー値及びルートノード

Xは1ルートノードのキーコード値は、検索は、検索が終了すると、成功した場合に等しいです。

2. xは、ツリーの左の部分木における主要ルートノードの値は、ルック未満である場合、

3. xは、ルートノードのキー値よりも大きく、ツリーの右部分木を見ると

2.3バイナリソートツリー挿入アルゴリズム

挿入されるように設けられたノード鍵はXです。

(1)検索が成功した場合、xの値を見つけるためにツリーの最初のノードは、ノードがすでに、全く挿入存在しないことを示します。

(2)ルックアップが失敗した場合、ノードが存在しない、それがツリーに挿入されています

したがって、新しいノードがリーフノードが挿入されなければならないように挿入されています。

2.4 2つのバイナリソートツリー構築アルゴリズム

バイナリソートツリー構築プロセスは、バイナリツリーは、ツリー内のノードを挿入するプロセスに一つずつ空開始します。

キーシーケンスセットのレコードがある:63,90,70,55,67,42,98,83,10,45,58

削除アルゴリズム2.5バイナリソートツリー

削除ノードは、* P(pは、削除対象のノードへのポインタである)、その親ノード* Fに設定されています。

(1)* pがリーフノードである:フィールドブランキングに対応するポインタF *

(2)* P右または左サブツリーサブツリー:> rchild / P-> lchild P、Pで置換することができます

(3)* pが両方左サブツリー右サブツリーを有する:配列即時先行(後継)ノード値を持つツリートラバーサル順序を置換することができる削除されました。次のように具体的な手順は次のとおりです。

これまでのところ右の子がなくなるまで1 *右の鎖ドメインの左の子に沿ってpは、それを探してきました。*即時先行ノードpは確かに右の子ではありません

2.用 *p 前驱节点的关键码值取代 *p 的关键码值

3.删除 *p 前驱节点

3.源代码示例

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

typedef int KeyType;                        /* 定义节点关键码的类型为整型 */
typedef struct node                         /* 二叉排序树的结构体 */
{
    KeyType key;                            /* 树节点的关键码 */
    struct node * lchild, * rchild;         /* 左右孩子指针 */
}node, * BiSortTree;

void CreateBST(BiSortTree * T);             /* 构造二叉排序树 */
void InsertBST(BiSortTree * T, KeyType x);  /* 向T中插入关键码值为 x 的节点 */
void DeleteBST(BiSortTree * T, KeyType x);  /* 删除T中关键码值为 x 的节点 */
void TraverseBST(BiSortTree T);             /* 中序遍历BST */
int SearchBST(BiSortTree T, KeyType x, BiSortTree * p, BiSortTree * f);
int SearchBST_Recursive(BiSortTree T, KeyType x, BiSortTree * p, BiSortTree * f);
/* 在T中查找关键码值为 x 的节点,若找到则返回1,p指向该节点,f指向该节点双亲节点;否则返回0*/

int main(void)
{
    BiSortTree T, p, f;

    p = f = NULL;
    CreateBST(&T);
    printf("遍历:");
    TraverseBST(T);
    printf("\n");

    printf("查找 98 :");
    int flag = SearchBST(T, 98, &p, &f);
    if (flag) printf("查找成功!\n");
    else printf("查找失败!\n");

    printf("递归查找 100 :");
    flag = SearchBST_Recursive(T, 100, &p, &f);
    if (flag) printf("查找成功!\n");
    else printf("查找失败!\n");

    printf("插入 77 :");
    InsertBST(&T, 77);
    TraverseBST(T);
    printf("\n");

    printf("删除 77 :");
    DeleteBST(&T, 77);
    TraverseBST(T);
    printf("\n");

    return 0;
}

void CreateBST(BiSortTree * T)              /* 构造二叉排序树 */
{
    KeyType x;

    printf("请输入若干整数构建BST,以 -1 结束:");

    *T = NULL;
    scanf("%d", &x);
    while (x != -1)
    {
        InsertBST(T, x);
        scanf("%d", &x);
    }
}
/* 在T中查找关键码值为 x 的节点,若找到则返回1,*p指向该节点,*f为*p双亲节点;否则返回0*/
int SearchBST(BiSortTree T, KeyType x, BiSortTree * p, BiSortTree * f)
{
    *p = T;
    while (*p)
    {
        if ((*p)->key == x) return 1;       /* 查找成功 */
        else
        {
            if (x < (*p)->key)              /* 在左子树继续查找 */
            { *f = *p; *p = (*p)->lchild; }
            else                            /* 在右子树继续查找 */
            { *f = *p; *p = (*p)->rchild; }
        }
    }

    return 0;                               /* 查找失败 */
}
int SearchBST_Recursive(BiSortTree T, KeyType x, BiSortTree * p, BiSortTree * f)
{
    if (!T)                                 /* 树空时,查找失败 */
        return 0;
    else if (x == T->key)                   /* 查找成功 */
        { *p = T; return 1; }
    else if (x < T->key)                    /* 在左子树继续查找 */
        SearchBST_Recursive(T->lchild, x, p, &T);
    else                                    /* 在右子树继续查找 */
        SearchBST_Recursive(T->lchild, x, p, &T);
}
void InsertBST(BiSortTree * T, KeyType x)   /* 向T中插入关键码值为 x 的节点 */
{
    BiSortTree p, f, s;

    f = p = NULL;
    if (!SearchBST(*T, x, &p, &f))          /* 若树中不存在关键码值为 x 的节点,则插入 */
    {
        s = (node *)malloc(sizeof(node));   /* 申请节点并赋值 */
        s->key = x;
        s->lchild = NULL;
        s->rchild = NULL;

        if (!*T) *T = s;                    /* 若树为空,将新申请的节点作为根节点 */
        else
        {
            if (x < f->key)                 /* 插入节点为f的左孩子 */
                f->lchild = s;
            else                            /* 插入节点为f的右孩子 */
                f->rchild = s;
        }
    }
}
void DeleteBST(BiSortTree *T, KeyType x)    /* 删除T中关键码值为 x 的节点 */
{
    BiSortTree p, f, s, s_parent;
    /**
     * p:要删除的节点 
     * f:p的双亲结点
     * s:p的中序前驱节点 
     * s_parent:s的双亲结点 
     */    

    p = f = NULL;
    if (SearchBST(*T, x, &p, &f))           /* 若树中存在关键码值为 x 的节点,则删除 */
    {
        if (!p->lchild && !p->rchild)       /* 被删除节点无左右孩子 */
        {
            if (p == *T)                    /* 若删除的是根节点 */
            {
                *T = NULL;
                free(p);
            }
            else                            /* 若删除的不是根节点 */
            {
                if (p->key < f->key)
                    f->lchild = NULL;
                else
                    f->rchild = NULL;
                free(p);
            }
        }
        else if (!p->lchild && p->rchild)   /* 被删除节点有右孩子无左孩子 */
        {
            if (p == *T)                    /* 若删除的是根节点 */
            {
                *T = p->rchild;
                free(p);
            }
            else                            /* 若删除的不是根节点 */
            {
                if (p->key < f->key)
                    f->lchild = p->rchild;
                else
                    f->rchild = p->rchild;
                free(p);
            }
        }
        else if (p->lchild && !p->rchild)   /* 被删除节点有左孩子无右孩子 */
        {
            if (p == *T)                    /* 若删除的是根节点 */
            {
                *T = p->lchild;
                free(p);
            }
            else                            /* 若删除的不是根节点 */
            {
                if (p->key < f->key)
                    f->lchild = p->lchild;
                else
                    f->rchild = p->lchild;
                free(p);
            }
        }
        else                                /* 被删除节点有左右孩子 */
        {
            s_parent = p;
            s = p->lchild;
            while (s->rchild)               /* 查找被删除节点中序前驱节点 */
            {
                s_parent = s;
                s = s->rchild;
            }
            p->key = s->key;
            if (s_parent == p)
                s_parent->lchild = s->lchild;
            else
                s_parent->rchild = s->lchild;
            free(s);
        }
    }
}
void TraverseBST(BiSortTree T)              /* 中序遍历BST */
{
    if (T)
    {
        TraverseBST(T->lchild);
        printf("%d, ", T->key);
        TraverseBST(T->rchild);
    }
}

发布了50 篇原创文章 · 获赞 38 · 访问量 1万+

おすすめ

転載: blog.csdn.net/weixin_42250302/article/details/89758376