在复习数据结构,把这个东西总结一下。
这种结构是动态查找表,这种动态是相对静态查找(顺序查找,折半查找,分块查找等)来说的。对于各种静态链表,要达到查找复杂度为O(logn),必须要求有序;而要使插入删除复杂度为O(1),必须是链表存储。动态查找表就可以同时满足这两者。
动态查找表的特点是表结构本身在查找过程中动态生成,即对给定的关键字key,若表中存在其关键字等于key的记录,则查找成功返回,否则插入关键字等于key的记录.
二叉排序树定义:二叉排序树要么是空树,要么是满足以下条件的树
(1)若它的左子树不空,则左子树上的所有节点值都小于双亲节点的值
(2)若它的右子树不空,则左子树上的所有节点值都大于双亲节点的值
(3)双亲节点的左右子树也是二叉排序树
是一个递归定义。
对于任何一个二叉排序树进行中序遍历,可得到一个有序序列(因为中序遍历访问顺序是“左根右”,有二叉排序树的定义可知,一定得到有序序列)。所以可以将其看成一个有序表,它与二叉查找树的区别是,后者是由有序表构成的,而二叉排序树是可以由无序序列构成。
(一)查找算法
中文描述:
1.若树空,则查找失败,退出
2.若树非空
21.若查找的值等于根节点的值,则查找成功。
22.若查找的值小于根节点的值,则递归查找左子树
23.若查找的值大于根节点的值,则递归查找右子树
c语言描述:
BOOL SearchBST(BiTree bt,KeyType key,BiTree f,BiTree p){
if (!bt){p=f; return false;}//查找失败
else {
if EQ(bt->data.key,key){p=bt; return true;}//查找成功
else if LT(bt->data.key,key) SearchBST(bt->lchild,key,bt,p);//递归查找左子树
else SearchBST(bt->lchild,key,p);
}
}
而动态查找表的动态性还体现在,当查找失败时并不是什么都不做,而是将其插入查找表中,如对于二叉排序树,要将每个查找失败的节点插入树中,而且都是插入到叶子节点。上面的p指针即是返回查找到的节点或者查找失败的节点留作插入用。
插入算法:
BOOL Insert(BiTree bt,BiTree &p)
{
if(!SearchBST(Bbt, key, NULL, p))
{
s=(BiTree)malloc(sizeof(BiTNode));
s->data = key;
s->lchild = s->rchild = NULL;
if(!p) bt = s;//树空
else if LT(p.key,key) p->rchild = s;
else p->lchild = s;
return true;
}else return false;
}
(未完待续)