概念
二叉排序树是一种动态树表。特点是树的结构不是一次生成的,而是在查找的整个过程中,当树中不存在给定关键字等于给定的值的时候在进行插入。新插入的节点一定是一个新添加的用户的节点。
方法实现
定义节点信息
typedef struct BSTNode
{
T data;
BSTNode *leftChild;
BSTNode *rightChild;
}BSTNode;
插入节点
BOOL InsertBSTree(BSTNode **t, T x)
{
//头结点是空的话
if((*t) == NULL){
*t= (BSTNode *)malloc(sizeof(BSTNode));
(*t)->data = x;
(*t)->leftChild = NULL;
(*t)->rightChild = NULL;
return TRUE;
}else if(x > (*t)->data){
InsertBSTree(&(*t)->leftChild, x);
}else if(x < (*t)->data){
InsertBSTree(&(*t)->rightChild, x);
}
return FALSE;//相同的话就不进行插入
}
排序
void Sort(BSTNode *t)
{
if(t != NULL){
Sort(t->leftChild);
printf("%d ", t->data);
Sort(t->rightChild);
}
}
查找
BSTNode* Search(BSTNode *t, T key)
{
if(t == NULL || t->data == key)
return t;
if(key < t->data)//在左孩子找
return Search(t->leftChild, key);
if(key > t->data)
return Search(t->rightChild, key);
}
删除
//删除一个节点
BOOL RemoveBSTree(BSTNode **t, T key)
{
if(*t == NULL){
return FALSE;
}
//如果没有找到就继续找
if(key < (*t)->data)
RemoveBSTree(&(*t)->leftChild, key);
else if(key > (*t)->data)
RemoveBSTree(&(*t)->rightChild, key);
else{
//这是找到的情况
BSTNode *p = NULL;
//找到的要删除的节点都有左子树和右子树
if((*t)->leftChild != NULL && (*t)->rightChild != NULL){
p = (*t)->rightChild;
while(p->leftChild != NULL)
p = p->leftChild;
(*t)->data = p->data; //找到最小的点,并且赋值给要删除的点。
RemoveBSTree(&(*t)->rightChild, p->data);
}else{
p = *t;
if((*t)->leftChild == NULL) //左孩子是空
(*t) = (*t)->rightChild; //指向右孩子
else
(*t) = (*t)->leftChild;
free(p);
p = NULL;
}
}
}
性能分析
在二叉排序树上查找其关键字等于给定值的节点的过程,是一条根节点到该节点路径的过程,和给定值比较的关键字的关键字个数等于节点所在的层次数。比较的次数不会超过树的深度。
数据一样,不同的二叉树的比较次数不一样。