二叉查找树
来源:互联网 发布:cnc编程培训 编辑:程序博客网 时间:2024/05/23 19:26
二叉树是一种很好的存储结构,通过二叉树衍生的更高级的如红黑树,AVL,SBT等在各个领域程序,算法中都常会见到它的身影。
二叉查找树是具有以下性质的二叉树:
1、若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2、若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3、它的左、右子树也分别为二叉查找树;
4、没有键值相等的节点。
二叉查找树的优势在于它的时间复杂度较低,为O(log n)。
它的搜索,插入,删除的复杂度等于树高,期望O(log n),最坏O(n)(数列有序,树退化成线性表)。
二叉查找树的查找算法 树b中查找x的过程(伪代码):
if (b是空树) 搜索失败else {if (x == b的根结点数据域值)查找成功else if (x < b的根结点数据域值)搜索左子树,重新上面搜索方法(递归)else搜索右子树,重新上面搜索方法(递归)}
二叉查找树的插入算法 向b中插入节点x的过程(伪代码):
if (b是空树)s节点作为根节点插入else {if (s节点域值 == b根节点域值)return//已经有这个节点域值了 else if (s节点域值 < b根节点域值)s节点插入左子树中(递归)elses节点插入右子树中(递归)}
二叉查找树的删除算法 删除节点p,删除分为三种情况:
1、若节点p为叶子节点(PL左子树和PR右子树均为空树),则直接修改双亲节点的指针。
2、若节点p只有左子树PL或右子树PR,只要让PL或PR成为其双亲节点的PL或PR(原p节点所在的子树位置)
3、若节点p的左右子树均不为空,需要调整,有两种做法:一、让节点p的左子树作为双亲节点f的左/右子树(根据节点p为双亲节点f的左子树还是右子树而定),节点p的右子树作为p左子树的最右下节点s的右子树;二、让节点p的直接前驱(或直接后继)(即左子树最右或右子树最左节点)替代节点p,然后在从二叉树中删除它的直接前驱(或直接后继) 实现过程:
if (右子树为空) {节点p = 节点p的左子树} else if (左子树为空) {节点p = 节点p的右子树} else {//左右子树均不为空 获取左子树最右节点s节点p->data = 节点s ->data 删除直接前驱s(删除方法同理,可用递归)}
通过上面我们可以知道二叉查找树的查询复杂度更树的深度有关,深度越大,查询的复杂度也越大。为了提高查询效率,对二叉查找树进行了优化,产生了平衡二叉树,所有叶子的深度趋于平衡。
常见的平衡树有:AVL树、红黑树、Treap树等。这些树的高度为O(log n)。
- 查找--二叉查找树
- 二叉树、二叉查找树
- 二叉树 & 二叉查找树
- 【查找结构】二叉查找树
- 查找之二叉树查找
- 查找之二叉树查找
- 查找:二叉查找树总结
- 二叉树查找树...
- 二叉树查找树
- 查找--遍历二叉树
- 二叉查找树
- 二叉查找树实现
- 二叉查找树
- 动态二叉查找树
- 最优二叉查找树
- 二叉查找树
- 二叉查找树
- 平衡二叉查找树
- Cocos2d-x 3.2 大富翁游戏项目开发-第二十七部分 技能提升和游戏结束判断
- php发送get、post请求的几种方法
- Java读写Properties文件
- docker malware分析
- linux ps 查看进程命令
- 二叉查找树
- nyoj 289 苹果 【01-背包】
- 【C#】 6.Set<T>数据类型
- .net基础--MSSQL函数isnull()简介
- 设计模式--代理模式
- Spring注解@Component、@Repository、@Service、@Controller区别
- C语言基础——指针1
- C# ASP.NET替换要转化为json的数据中的特殊符号
- 软件质量保证管理办法