ディレクトリ
静的および動的な外観のルックアップテーブルの表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);
}
}