二叉排序树
二叉排序树(Binary Sort Tree)又称二叉查找树。
它或者是一棵空树;或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
二叉排序树的查找:
步骤:若根结点的关键字值等于查找的关键字,成功。
否则,若小于根结点的关键字值,递归查左子树。
若大于根结点的关键字值,递归查右子树。
若子树为空,查找不成功。
二叉排序树的插入和删除:
与次优二叉树相对,二叉排序树是一种动态树表。其特点是:树的结构通常不是一次生成的,而是在查找过程中,当树中不存在关键字等于给定值的节点时再进行插入。新插入的结点一定是一个新添加的叶子节点,并且是查找不成功时查找路径上访问的最后一个结点的左孩子或右孩子结点。
插入算法:
首先执行查找算法,找出被插结点的父亲结点。
判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入。
若二叉树为空。则首先单独生成根结点。
注意:新插入的结点总是叶子结点。
//在二叉排序树中插入查找关键字key
void InsertBST(t,key)
{
if(t==NULL)
{
t=new BiTree;
t->lchild=t->rchild=NULL;
t->data=key;
return;
}
if(key<t->data )
InsertBST(t->lchild,key);
else
InsertBST (t->rchild, key );
}
//n个数据在数组d中,tree为二叉排序树根
void CreateBiTree(tree,d[ ],n)
{
tree=NULL;
for(i=0;i<n;i++)
InsertBST(tree,d);
}
最小值二叉树c例程:
#include<stdio.h>
struct priorityqueue
{
int capacity;
int size;
int *elements;
}*tryit;
struct priorityqueue *initialize ( int maxelements )
{
struct priorityqueue *h;
h = malloc ( sizeof ( struct priorityqueue ) );
h -> elements = malloc ( sizeof ( int ) * ( maxelements + 1 ) );
h -> capacity = maxelements;
h -> size = 0;
h -> elements[0] = -23767;
return h;
}
void insert ( int x , struct priorityqueue *h )
{
int i;
for ( i = ++h -> size ; h -> elements[ i / 2 ] > x ; i /= 2 )
h -> elements[ i ] = h -> elements[ i / 2 ];
h -> elements [ i ] = x;
}
int deletemin ( struct priorityqueue *h )
{
int i , child ;
int minelement , lastelement;
minelement = h -> elements[ 1 ];
lastelement = h -> elements[ h -> size-- ];
for ( i = 1 ; i * 2 <= h -> size ; i = child )
{
child = i * 2;
if ( child != h -> size && h -> elements[ child + 1 ] < h -> elements[ child ] )
child++;
if ( lastelement > h -> elements[ child ] )
h -> elements[ i ] = h -> elements[ child ];
else
break;
}
h -> elements[ i ] = lastelement;
return minelement;
}
main()
{
tryit = initialize ( 10 );
insert ( 4 , tryit );
insert ( 5 , tryit );
insert ( 10 , tryit );
insert ( 3 , tryit );
printf ( "%d
" , deletemin ( tryit ) );
printf ( "%d
" , deletemin ( tryit ) );
printf ( "%d
" , deletemin ( tryit ) );
printf ( "%d
" , deletemin ( tryit ) );
getch();
}