一.查找
1.静态查找与动态查找
- 动态查找是对数据进行更改,而静态查找对数据不进行更改
二. 二叉搜索树
2.1性质:
- 若他的左子树不空,则左子树上所有结点的值均小于它的根节点的值
- 若它的右子树不空,则右子树上所有结点的值均大于它根节点的值
- 它的左右子树也都是二叉排序树
2.2创建二叉搜索树
typedef struct node
{
int data;
struct node*lchild;
struct node*rchild;
}BSTnode;
typedef struct BST
{
BSTnode*root;
}BST;
void init(BST* b)
{
b->root=NULL;
}
bool insert(BSTnode**t,int x)
{
if(*t!=NULL)
{
*t=(BSTnode*)malloc(sizeof(BSTnode));
*t->data=x;
*t->lchild=NULL;
*t->rchild=NULL;
return true;
}
else if(x<(*t)->data)
{
insert(&((*t)->lchild),x);
}
else if(x>(*t)->data)
{
insert(&((*t)->rchild),x);
}
return false;
}
2.3得到最大最小值
int min(BSTnode*t)
{
while(t->lchild!=NULL)
{
t=t->lchild;
}
return t->data;
}
int max(BSTnode*t)
{
while(t->rchild!=NULL)
{
t=t->rchild;
}
return t->data;
}
2.4排序
void sort(BSTnode*t)
{
if(t!=NULL)
{
sort(t->lchild);
printf("%d ",t->data);
sort(t->rchild);
}
}
2.5删除某个数
bool removeBST(BSTnode**t,int key)
{
if(*t==NULL)
return false;
if(key<(*t)->data)
removeBST(&(*t)->lchild,key);
else if(key>(*t)->data)
removeBST(&(*t)->rchild,key);
else
{
BSTnode*p;
if((*t)->lchild==NULL&&(*t)->rchild==NULL)
{
free(*t);
*t=NULL;
}
else if((*t)->lchild!=NULL&&(*t)->rchild==NULL)
{
p=*t;
*t=(*t)->lchild;
free(p);
p=NULL;
}
else if((*t)->rchild!=NULL&&(*t)->lchild==NULL)
{
p=*t;
*t=(*t)->rchild;
free(p);
p=NULL;
}
else
{
p=(*t)->rchild;
while(p->lchild!=NULL)
{
p=p->lchild;
}
(*t)->data=p->data;
removeBST(&(*t)->rchild,p->data);
}
}
return true;
}
2.6 查找节点
BSTnode* search(BST*t,key)
{
if(t==NULL)
return NULL;
if(t->data==key)
return t;
if(key<t->data)
return search(t->lchild,key);
else
return search(t->rchild,key);
}
2.7 对树置空
void makeEmpty(BSTnode**t)
{
if((*t)!=NULL)
{
makeEmpty(&((*t)->lchild));
makeEmpty(&((*t)->rchild));
free(*t);
*t=NULL;
}
}
2.8二叉排序树的特性
- 查找次数不超过树的深度
- 二叉排序树的形态尤为重要,与查找效率有关,因此需要将二叉树平衡化