数据结构——查找(二叉排序树)

文章目录

  • 前言
  • 一、二叉排序树
    • 构造二叉排序树步骤
    • 构造二叉排序树步骤图
    • 二叉排序树的查找
      • 二叉排序树查找递归算法
      • 二叉排序树查找非递归算法
    • 二叉排序树的插入
      • 二叉排序树插入结点——递归算法
      • 二叉排序树插入结点——非递归算法
    • 二叉排序树的删除
  • 总结


前言

二叉排序树查找定义
二叉排序树构造
二叉排序树查找递归和非递归算法
二叉排序树插入递归和非递归算法
二叉排序树删除递归和非递归算法


一、二叉排序树

  1. 动态查找表的特点是:
    表结构本身是在查找过程中动态生成的,即对于给定值key,
    若表中存在其关键字等于key的记录,则查找成功返回,否则插入关键字等于key的记录
  2. 定义:简称BST,也称二叉查找树;左子树值全部小于根结点值,右子树值全部大于根结点值,左右子树本身也是二叉排序树,所以二叉排序树中序遍历可以得到一个递增序列
    数据结构——查找(二叉排序树)_第1张图片

构造二叉排序树步骤

数据结构——查找(二叉排序树)_第2张图片

构造二叉排序树步骤图

数据结构——查找(二叉排序树)_第3张图片

二叉排序树的查找

  1. 二叉排序树查找:从根结点开始,沿某一条分支逐层向下进行比较的过程,将给定值与根结点进行比较,若相等,则查找成功;若根结点关键字大于关键字,在根结点左子树中查找,否则在右子树中查找,是一个递归的过程
    数据结构——查找(二叉排序树)_第4张图片

二叉排序树查找递归算法

BiTree SearchBST(BSTNode *T,elemType x)
{
//在根指针T所指二叉树中递归地查找某关键字等于
//key的数据元素,若查找成功,则返回指向该数据元素结点的指针,否则返回空指针
if ((T==NULL||(T->data==x)))  return(T);
else if (x< T->data)  
         return(SearchBST(T->lchild,x));
     else 
          return(SearchBST(T->rchild,x));
}

二叉排序树查找非递归算法

BSTNode SearchBST(BSTNode *T,elemType x)
{
	BSTNode *p=T;
	 while(p!=NULL)
 	  {
	   	if(x==p->data) 
   		return p;
   		else if(x<p->data)
        p=p->lchild;
         else
        p=p->rchild;
     }
   return p;
}


二叉排序树的插入

若关键字k小于根结点关键字,则插入左子树中,相反插入右子树中;一定插入了叶结点中
数据结构——查找(二叉排序树)_第5张图片

二叉排序树插入结点——递归算法

void  insertBST(BSTNode *T,BSTNode *s)
{ if(T==NULL) T=s;
  else if(s->data< p->data)  
            insertBST(T->lchild,s);
       else insertBST(T->rchild,s);
         }
   }

二叉排序树插入结点——非递归算法

void  InsertBST(BSTNode *T,elemType e)
{BSTNode *p=T,*s,*q;
 s=new BSTNode;s->data=e;
 s->rchild=s->lchild=NULL;
if(p==NULL) T=s;
 while(p!=NULL){ 
if(s->data<=p->data){ 
q=p;
              p=p->lchild;
      else{
q=p; 
              p=p->rchild;
}
     }
if(s->data<q->data)
q->lchild=s;
else             
q->rchild=s;  
  }

二叉排序树的删除

二叉排序树的删除:将单个元素删除,其他因为此删除的链再重新组合,确保性质不变
(1)若删除是叶结点,则直接删除
(2)若结点z只有一棵左子树或右子树,则让z的子树成为z父结点的子树,替代z位置
数据结构——查找(二叉排序树)_第6张图片
(3)若结点z有左右两棵子树,则令z的直接后继(或直接前驱)代替z,然后从二叉排序树中删除这个直接后继(或直接前驱)
数据结构——查找(二叉排序树)_第7张图片
6.二叉排序树的查找效率分析
(1)对于高度为H的二又排序树,其插入和删除操作的运行时间都是O(n)。但在最坏的情况下,构造二叉排序树的输入序列是有序的,则会形成一个倾斜的单支树,此时二叉排序树的性能显变坏,树的高度也增加为元素个数N,如下图所示:
在等概率情况下,图4-23(a)的查找成功的平均查找长度为
ASL=(1+2×2+3×4+4×3)/10=2.9
而图4-23(b)的查找成功的平均查找长度为
ASL=(1+2+3+4+5+6+7+8+9+10)/10=5.5
数据结构——查找(二叉排序树)_第8张图片
由上可知,二叉排序树查找算法的平均查找长度,主要取决于树的高度,即与二叉树的形态有关。如果二叉排序树是一个只有右(左)孩子的单支树(类似于有序的单键表),其平均查找长度和单链表相同,为O(n)。如果二义排序树的左、右子树的高度之差的绝对值不超过1,这样的二叉排序树称为平衡二叉树。它的平均查找长度达到 O(log2n)

二叉排序树与二分查找:从查找过程看,二叉排序树与二分查找相似。就平均时间性能而言,二叉排序树上的查找和二分查找差不多。但二分查找的判定树唯一,而二叉排序树不唯一,相同的关键字其插入顺序不同可能生成不同的二叉排序树,如上图所示;就维护表的有序性而言,二叉排序树无须移动结点,只需修改指针即可完成插入和删除操作,平均执行时间为 。二分查找的对象是有序顺序表,若有插入和删除结点的操作,所花的代价是O(n)。当有序表是静态查找表时,宜用顺序表作为其存储结构,而采用二分查找实现其查找操作;若有序表是动态查找表,则应选择二又排序树作为其逻辑结构


总结

二叉排序树查找定义
二叉排序树构造
二叉排序树查找递归和非递归算法
二叉排序树插入递归和非递归算法
二叉排序树删除递归和非递归算法

你可能感兴趣的:(数据结构,数据结构)