二叉排序树
这是一个比较有意思的二叉树。也是研究动态查找表一种方法
动态查找表是在查找一个表(某个数据结构)的过程,不仅仅有查询过程,也有添加,删除的操作。
二叉排序树(Binary Sort Tree)具有以下性质:
1.如果他的左子树不空,则左子树上所有结点的值都小于他的根结点的值。
2.如果他的右子树不空,则右子数上所有结点的值都大于他的根结点的值。
3.他的左右子树分别也是二叉排序树。
图示:
![查看更多精彩图片](http://photo19.hexun.com/p/2009/1223/377426/b_AF90EE48F9F139B28830B38B863656B8.jpg)
二叉排序树又称二叉查找树,根据上述的特点,他的查找过程和次优二叉树类似。查询的时候当树不空的时候,先将判断的值和树的根结点比较,如果相等则查找成功。如果不等根据大小关系,继续在左右子树上进行查询。
通常使用二叉链表作为二叉排序树的存储结构。
--------查找算法描述-------------------
BiTree SearchBST(BiTree,keyType key)
//在根指针T所指的二叉排序树中递归的查找某个关键字等于key的数据元素
//如果查找成功,则返回指向数据元素结点的指针,否则返回NULL
{
if((!T) || EQ(key.T->data.key) ) return (T);
else if ( LT(key,T->data.key) ) return (SearchBST(T->lchild,key));
else return (SearchBST(T->rchild,key));
}
2.二叉排序树的插入和删除
二叉树是一种动态树,在查找过程中不存在的结点可以动态的添加到二叉树上。而且新添加的结点一定是叶子结点。并且是查找不成功的路径上访问的最后结点的左结点或又结点。
对上面的查找方法进行改进,方便插入新结点
------------------新的查找方法------------
status SearchBST(BiTree T,keytype key,BiTree &p)
//在T上查找为key的关键字是否存在,如果存在返回true,并且使p指向该结点。如果不存在返回false,并且使p指向t上查找过程中的最后一个结点;指针f指向T的双亲,初始调用值为null
{
if(!T) {p = f ; return FALSE};
else if EQ(key,T->data.key) { p = T ; return true};
else if LT(key,T->data.key) return serachBST(T->lchild,key,T,p);
else return SearchBST(T->rchild,key,t,p);
}
------------------------插入--------------
status insertBST(BiTree &T,ElemType e)
{
if(!SearchBST(T,e.key,null,p))//查找不成功
{
s = (BiTree)malloc(sizeof(BiNode));
s->data = e; s->lchild = null; s->rchild = null;
if (!p) T= s;//被插结点*S为新的根结点
else if LT(e.ke,p->data.key) p->lchild = s;//被插结点为左结点
else p ->rchild = s;
return true;
}
}
动态查找表是在查找一个表(某个数据结构)的过程,不仅仅有查询过程,也有添加,删除的操作。
二叉排序树(Binary Sort Tree)具有以下性质:
1.如果他的左子树不空,则左子树上所有结点的值都小于他的根结点的值。
2.如果他的右子树不空,则右子数上所有结点的值都大于他的根结点的值。
3.他的左右子树分别也是二叉排序树。
图示:
![查看更多精彩图片](http://photo19.hexun.com/p/2009/1223/377426/b_AF90EE48F9F139B28830B38B863656B8.jpg)
二叉排序树又称二叉查找树,根据上述的特点,他的查找过程和次优二叉树类似。查询的时候当树不空的时候,先将判断的值和树的根结点比较,如果相等则查找成功。如果不等根据大小关系,继续在左右子树上进行查询。
通常使用二叉链表作为二叉排序树的存储结构。
--------查找算法描述-------------------
BiTree SearchBST(BiTree,keyType key)
//在根指针T所指的二叉排序树中递归的查找某个关键字等于key的数据元素
//如果查找成功,则返回指向数据元素结点的指针,否则返回NULL
{
if((!T) || EQ(key.T->data.key) ) return (T);
else if ( LT(key,T->data.key) ) return (SearchBST(T->lchild,key));
else return (SearchBST(T->rchild,key));
}
2.二叉排序树的插入和删除
二叉树是一种动态树,在查找过程中不存在的结点可以动态的添加到二叉树上。而且新添加的结点一定是叶子结点。并且是查找不成功的路径上访问的最后结点的左结点或又结点。
对上面的查找方法进行改进,方便插入新结点
------------------新的查找方法------------
status SearchBST(BiTree T,keytype key,BiTree &p)
//在T上查找为key的关键字是否存在,如果存在返回true,并且使p指向该结点。如果不存在返回false,并且使p指向t上查找过程中的最后一个结点;指针f指向T的双亲,初始调用值为null
{
if(!T) {p = f ; return FALSE};
else if EQ(key,T->data.key) { p = T ; return true};
else if LT(key,T->data.key) return serachBST(T->lchild,key,T,p);
else return SearchBST(T->rchild,key,t,p);
}
------------------------插入--------------
status insertBST(BiTree &T,ElemType e)
{
if(!SearchBST(T,e.key,null,p))//查找不成功
{
s = (BiTree)malloc(sizeof(BiNode));
s->data = e; s->lchild = null; s->rchild = null;
if (!p) T= s;//被插结点*S为新的根结点
else if LT(e.ke,p->data.key) p->lchild = s;//被插结点为左结点
else p ->rchild = s;
return true;
}
}
本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。