二叉排序树(数学领域术语)

二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。是数据结构中的一类。在一般情况下,查询效率比链表结构要高。

二叉排序树(数学领域术语)

定义

二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3)左、右子树也分别为二叉排序树;

(4)没有键值相等的节点。

查找

步骤:

若根结点的关键字值等于查找的关键字,成功。

否则,若小于根结点的关键字值,递归查左子树。

若大于根结点的关键字值,递归查右子树。

若子树为空,查找不成功。

平均情况分析(在成功查找两种的情况下):

在一般情况下,设P(n,i)为它的左子树的结点个数为i时的平均查找长度。如图的结点个数为n=6且i=3;则P(n,i)=P(6,3)=[1+(P(3)+1)*3+(P(2)+1)*2]/6=[1+(5/3+1)*3+(3/2+1)*2]/6

注意:这里P(3)、P(2)是具有3个结点、2个结点的二叉分类树的平均查找长度。在一般情况,P(i)为具有i个结点二叉分类树的平均查找长度。

P(3)=(1+2+2)/3=5/3

P(2)=(1+2)/2=3/2∴P(n,i)=[1+(P(i)+1)*i+(P(n-i-1)+1)*(n-i-1)]/n

∴P(n)=

P(n,i)/n<=2(1+I/n)lnn

因为2(1+I/n)lnn≈1.38logn故P(n)=O(logn)

步骤

若根结点的关键字值等于查找的关键字,成功。

否则,若小于根结点的关键字值,递归查左子树。

若大于根结点的关键字值,递归查右子树。

若子树为空,查找不成功。

插入算法:

首先执行查找算法,找出被插结点的父亲结点。

判断被插结点是其父亲结点的左、右儿子。将被插结点作为叶子结点插入。

若二叉树为空。则首先单独生成根结点。

注意:新插入的结点总是叶子结点。

voidInsertBST(t,key)

//在二叉排序树中插入查找关键字key

{

if(t==NULL){

t=newBiTree;

t->lchild=t->rchild=NULL;

t->data=key;

return;}

if(keydata)InsertBST(t->lchild,key);

elseInsertBST(t->rchild,key);

}

voidCreateBiTree(tree,d【】,n)

//n个数据在数组d中,tree为二叉排序树根

{tree=NULL;

for(i=0;iInsertBST(tree,d);}

删除结点

在二叉排序树删去一个结点,分三种情况讨论:

若*p结点为叶子结点,即PL(左子树)和PR(右子树)均为空树。由于删去叶子结点不破坏整棵树的结构,则可以直接删除此子结点。

若*p结点只有左子树PL或右子树PR,此时只要令PL或PR直接成为其双亲结点*f的左子树(当*p是左子树)或右子树(当*p是右子树)即可,作此修改也不破坏二叉排序树的特性。

若*p结点的左子树和右子树均不空。在删去*p之后,为保持其它元素之间的相对位置不变,可按中序遍历保持有序进行调整,可以有两种做法:

C代码

性能分析

每个结点的C(i)为该结点的层次数。最坏情况下,当先后插入的关键字有序时,构成的二叉排序树蜕变为单支树,树的深度为其平均查找长度(n+1)/2(和顺序查找相同),最好的情况是二叉排序树的形态和折半查找的判定树相同,其平均查找长度和log2(n)成正比。

优化

SizeBalancedTree(SBT)

AVL树

红黑树

Treap(Tree+Heap)

这些均可以使查找树的高度为O(log(n))

该文章由作者:【然后怎样】发布,本站仅提供存储、如有版权、错误、违法等相关信息请联系,本站会在1个工作日内进行整改,谢谢!

发表回复

登录后才能评论