【数据结构——树表的查找(动态查找表)】
目录
动态查找表(基于树的查找法)
当表插入、删除操作频繁时,为维护表的有序性,需要移动表中很多记录。
改用动态查找表——几种特殊的树
表结构在查找过程中动态生成。
对于给定值:
若表中存在,则返回成功;
否则,插入关键字等于key的记录
(一)二叉排序树
1、定义
二叉排序树又称二叉查找树
定义:
二叉排序树或者是一棵空树;或者是具有如下特性的二叉树:
实例——判断二叉排序树
二叉排序树的存储结构:二叉链表表示
//二叉排序树的存储结构
typedef struct
{
KeyType key; //关键字项
InfoType otherinfo; //其他数据项
}ElemType; //每个结点的数据域的类型
typedef struct BSTNode
{ //结点结构
ElemType data; //数据域
struct BSTNode* lchild, * rchild; //左右孩子的指针
}BSTNode,*BSTree;
2、查找算法
算法思想
算法描述
typedef struct BSTNode
{ //结点结构
ElemType data; //数据域
struct BSTNode* lchild, * rchild; //左右孩子的指针
}BSTNode,*BSTree;
BSTree SearchBST(BSTree T, KeyType key)
{
//在指针T所指的二叉排序树中递归地查找某关键字等于key的数据元素
//若查找成功,则返回指向该数据元素结点的指针,否则返回空指针
if (!T || key == T->data.key)
return T; //查找结束
else if (key < T->data.key)
return SearchBST(T->lchild,key);//在左子树中继续查找
else
return SearchBST(T->rchild,key);//在右子树中继续查找
}
二叉排序树的查找分析:
(1)在二叉排序树上查找其他关键字等于给定值的结点的过程,恰是走了一条从根结点到该结点的路径的过程。
比较的关键字次数=次结点所在的层次数
最多比较次数=树的深度
(2)但 二叉排序树平均查找长度和树的形态有关
3、插入算法
typedef struct BSTNode
{ //结点结构
ElemType data; //数据域
struct BSTNode* lchild, * rchild; //左右孩子的指针
}BSTNode, * BSTree;
//二叉排序树的插入
void InsertBST(BSTree& T, ElemType e)
{//当二叉排序树T中不存在关键字等于e.key的数据元素时,则插入该元素
if (!T) //T为空树
{ //找到插入位置,递归结束
BSTree S;
S = new BSTNode; //生成新结点*S
S->data = e; //新结点数据域置为e
S->lchild = S->rchild = NULL;//新结点*S作为叶子结点
T = S; //把新结点*S链接到已找到的插入位置
}
else if (e.key < T->data.key)
InsertBST(T->lchild, e); //将*S插入左子树
else if (e.key > T->data.key)
InsertBST(T->rchild, e); //将*S插入右子树
}
4、创建算法
typedef struct BSTNode
{ //结点结构
ElemType data; //数据域
struct BSTNode* lchild, * rchild; //左右孩子的指针
}BSTNode, * BSTree;
//创建
void CreatBST(BSTree& T)
{ //依次读入一个关键字为key的结点,将此结点插入到二叉排序树T中
T = NULL; //将二叉排序树T初始化为空树
cin >> e;
while (e.key != ENDFLAG)
{ //ENDFLAG为自定义常量,作为输入结束标志
InsertBST(T, e); //将此结点插入到二叉排序树T中
cin >> e;
}
}
5、删除算法
(1)被删除结点*p为叶子结点
(2)被删除结点*p只有左子树或者只有右子树
实例:
(3)被删除结点*p既有左子树又有右子树
实例
例:
算法描述:
//在这里插入代码片
(二)平衡二叉树
1、平衡二叉树的定义
平衡二叉树又称AVL树
一棵AVL树或者是空树,或者是具有下列性质的二叉排序树:
(1)它的左子树和右子树都是AVL树,且左子树和右子树的深度之差的绝对值不超过1
(2)左子树和右子树也是AVL树
···每个结点附加一个数字,给出该结点的平衡因子BF:该结点的左子树深度和右子树深度之差。
···AVL树任一结点平衡因子只能取-1,0,1
2、如何构造平衡二叉树
如果在一棵AVL树中插入一个新结点,就有可能造成失衡,此时必须重新调整树的结构,使之恢复平衡
调整方法:找到离插入点最近且平衡因子绝对值超过1的祖先结点,以该结点为根的子树称为最小不平衡子树,可将重新平衡的范围局限于这棵子树。
平衡调整的四种类型
LL型调整:
RR型调整:
LR型调整:
RL型调整:
3、AVL的插入
实例:
(三)B-树
1、B-树的概念
2、B-树的结点特点
3、B-树的特点