二叉排序树(BST)构造与应用
本文取自《数据结构与算法》(C语言版)(第三版),出版社是清华大学出版社。
在VS2010中新建C++ Win32 控制台应用程序项目,创建结果截图:
二叉排序树(BST):又称二叉查找树,其定义为:二叉排序树或者是空树,或者是满足以下性质的二叉树。
(1) 若它的左子树非空,则左子树上所有记录的关键字均小于根记录的值。
(2) 若它的右子树非空,则右子树上所有记录的关键字均大于根记录的值。
(3) 左、右子树本身又各是一棵二叉排序树。
按中序遍历BST所得到的中序序列是一个递增有序序列。
二叉排序树的类型定义:
typedef struct BSTNode
{
KeyType key; //数据域
BSTNode *lchild;
BSTNode *rchild;
}
1.二叉排序树的插入操作 int InsertBST(BSTNode *p, KeyType k)
{
if(p==NULL)
{
p=(BSTNode*)malloc(sizeof(BSTNode));
p->key=k;
p->lchild=p->rchild=NULL;
return 1;
}
else if(k==p->key)
return 0;
else if(kkey)
return InsertBST(p->lchild, k);
else
return InsertBST(p->rchild, k);
}
二叉排序树的生成算法:
BSTNode *CreateBST(KeyType A[], int n)
{
BSTNode *bt=NULL;
int i=0;
while(i
示例:输入{50,16,56,52,8}生成二叉排序树
2.二叉排序树的查找操作
首先将需要查找的值与根结点比较,如果相等则查找成功,算法终止;如果比根结点小则左子树中查找,如果比根结点大则到右子树查找。
二叉排序树的查找算法的递归形式
BSTree SearchBST(BSTree t, int k)
{
if(t==null || k==t->key)
return t;
else if(kkey)
return SearchBST(t->lchild, k);
else
return SearchBST(t->rchild, k);
}
二叉排序树的查找算法的非递归形式
BSTree SearchBST2(BSTree t, int k)
{
BSTree p=t;
while(p!=null && p->key!=k)
{
if(kkey)
p=p->lchild;
else
p=p->rchild;
}
return p;
}
查找过程演示图:
3.二叉排序树的删除操作
删除二叉排序树的某一个结点的步骤如下:free(p);
操作示意图如下:
(2)*p只有左子树,或只有右子树。free(p);
操作示意图如下:
(3)*p有左右子树。free(p);
操作示意图如下:
方法二:用*p结点在中序序列中的直接前驱(或后继)*s代替*p,然后再从二叉排序树中将*s删除。这时如果*s为*p的直接前驱,则*s只有左子树(或者没有孩子),则删除*s可以按照删除*p的其余两种情况处理。如果*s为*p的直接后继,则*s只有右子树(或者没有孩子),删除*s同理可以按照删除*p的其余两种情况处理。
#include
#include
#define MAX 100
typedef struct tnode
{
int data;
struct tnode *lchild, *rchild;
}TNODE;
void create();
void insert(int m); //插入二叉排序树的结点
void inOrder(TNODE *ptr); //中序遍历
TNODE *root=NULL;
void inOrder(TNODE *ptr)
{
if(ptr!=NULL)
{
inOrder(ptr->lchild);
printf("%d ", ptr->data);
inOrder(ptr->rchild);
}
}
void create()
{
int n, i;
int k[MAX];
printf("Please input the node number:\n");
scanf("%d", &n);
for(i=0; idata=m;
root->lchild=root->rchild=NULL;
}
else
{
p1=root;
while(m!=p1->data)
{
if((mdata) && (p1->lchild!=NULL))
p1=p1->lchild;
else if((m>p1->data) && (p1->rchild!=NULL))
p1=p1->rchild;
else if((mdata) && (p1->lchild==NULL))
{
p2=(TNODE *)malloc(sizeof(TNODE));
p2->data=m;
p2->lchild=p2->rchild=NULL;
p1->lchild=p2;
return;
}
else if((m>p1->data) && (p1->rchild==NULL))
{
p2=(TNODE *)malloc(sizeof(TNODE));
p2->data=m;
p2->lchild=p2->rchild=NULL;
p1->rchild=p2;
return;
}
}
}
}
int main()
{
create();
printf("\n");
inOrder(root);
printf("\n");
return 0;
}
Ctrl+F5运行SortTree.cpp输出结果如下:
#include
#include
#define MAX 100
typedef struct tnode
{
int data;
struct tnode *lchild, *rchild;
}TNODE;
int last=0;
void create();
void insert(int m); //插入二叉排序树的结点
void findMaxMin(int aim, TNODE *ptr);
TNODE *root=NULL;
void findMaxMin(int aim, TNODE *ptr)
{
if(ptr!=NULL)
{
findMaxMin(aim, ptr->lchild);
if(lastdata>=aim) //找到小于aim的最大元素
printf("a=%d\n",last);
if(last<=aim && ptr->data>aim) //找到大于aim的最小元素
printf("b=%d\n",ptr->data);
last=ptr->data;
findMaxMin(aim, ptr->rchild);
}
}
void create()
{
int n, i;
int k[MAX];
printf("Please input the node number:\n");
scanf("%d", &n);
for(i=0; idata=m;
root->lchild=root->rchild=NULL;
}
else
{
p1=root;
while(m!=p1->data)
{
if((mdata) && (p1->lchild!=NULL))
p1=p1->lchild;
else if((m>p1->data) && (p1->rchild!=NULL))
p1=p1->rchild;
else if((mdata) && (p1->lchild==NULL))
{
p2=(TNODE *)malloc(sizeof(TNODE));
p2->data=m;
p2->lchild=p2->rchild=NULL;
p1->lchild=p2;
return;
}
else if((m>p1->data) && (p1->rchild==NULL))
{
p2=(TNODE *)malloc(sizeof(TNODE));
p2->data=m;
p2->lchild=p2->rchild=NULL;
p1->rchild=p2;
return;
}
}
}
}
int main()
{
int toBeFind;
create();
printf("\n");
printf("Input the record to be finded! \n");
scanf("%d", &toBeFind);
findMaxMin(toBeFind, root);
printf("\n");
return 0;
}
Ctrl+F5运行SortTree1.cpp输出结果如下: