二进制搜索树(BSTs) 和AVL 树
二进制搜索树(BSTs) 和AVL 树
基本数据结构
元素可以包含卫星数据,并且使用一个键来标识该元素。
对动态集 S 的操作:
Search(S, k):返回带有键 k 的元素 x,或 NIL
Insert(S, x):将元素 x 添加到 S
Delete(S, x):从 S 中删除元素 x
最小值(S),最大值(S):仅适用于全序集
Successor(S, x), Predecessor(S, x):下一个或上一个元素
insert :: Ord a => a -> Tree a -> Tree a
insert a Empty = Node Empty a Empty
insert a (Node left root right)| a < root = Node (insert a left) root right| otherwise = Node left root (insert a right)
直观地说:每个节点最多有两个子树。
我们可以递归地定义二进制树:它是一个定义为有限节点集的结构,使得树为空(无节点)或它由根节点、左子树和右子树组成
这种观点对于通过归纳证明关于树的陈述非常方便。
将列表转换为 BST(使用 foldr)
foldTree :: Ord a => [a] -> Tree a
foldTree = foldr insert Empty
树中的路径是由边链接的节点序列。 路径的长度是边的数量。
树的叶子是没有子节点的节点; 否则称为内部节点。
我们以显而易见的方式谈论兄弟姐妹、父母、祖先、后代。
树中节点的深度是从该节点到根的(简单)路径的长度。树的一个级别是一组相同深度的节点。
树中节点的高度是从该节点到叶子的最长路径的长度。一棵树的高度就是它的根的高度。
如果每个节点都是叶子或恰好有两个孩子,则二进制树是满的。
如果它已满并且所有叶子具有相同的水平,则它是完整的。
这个数据结构的定义是最好的:
data Tree a = Empty | Node (Tree a) a (Tree a)
深度和完整性
如果每个节点的两个子树大小相等,则二进制树是完整的。 定义一个决定二进制树是否完整的函数。
为了完成这个,一个典型的解决方案涉及一个高度函数:
平衡的二进制搜索树
什么是平衡树?
“如果每个子树都是平衡的,并且两个子树的高度最多相差一个,那么这棵树就是平衡的”
定义一个函数 balance :: [a] -> Tree a 将非空列表转换为平衡树。
检查二叉树是否平衡(是BST)
balanced :: (Ord a) => Tree a -> Bool
balanced Empty = True
balanced (Node l root r)| not (balanced l) = False| not (balanced r) = False| abs ((height l) - (height r)) > 1 = False| otherwise = True
这个二叉树不平衡(不是BST)
最简单的方法是将派生 Show 添加到您的类型定义中,以便获得结果
data Tree a = Empty | Node (Tree a) a (Tree a)deriving Show
使 Tree 成为 Show 的一个实例!
结果看起来像这种格式:
二进制搜索树(BSTs)
二进制树只有当它们是二进制搜索树时才真正有用。
提供家庭作业解决方案的平衡功能并不是很有用。
如果 y 是 x 的左子树中的一个节点,则 y.key ≤ x.key。
如果 y 是 x 的右子树中的一个节点,则 y.key ≥ x.key。
Search(S, k):返回带有键 k 的元素 x,或 NIL
想法:与当前键比较并停止或向左或向右走。
插入一个元素
insert :: Ord a => a -> Tree a -> Tree a
insert a Empty = Node Empty a Empty
insert a (Node left root right)| a < root = Node (insert a left) root right| otherwise = Node left root (insert a right)foldTree :: Ord a => [a] -> Tree a
foldTree = foldr insert Empty
寻找元素
contains :: Ord a => a -> Tree a -> Bool
contains a Empty = False
contains a (Node left root right)| a == root = True| a < root = contains a left| otherwise = contains a right
平衡的 BST
所以现在 BST 搜索得到了改进,因为平均而言我只需要搜索一半。不过,我仍然可以进行完整搜索,因为我可以拥有树枝状的树
平衡的 BST 将提供更好的结果。
AVL 树
如果对于每个节点都满足以下条件,则二进制树称为 AVL 树:左子树的高度和右子树的高度最多相差 1。
我们如何确保这一点? 在插入时平衡树:
就像在普通的二叉搜索树中一样工作。
但是树可能会变得不平衡,因此我们需要重新平衡.我们记录新元素的搜索路径,然后只要当前子树的高度增加,就可以备份搜索路径以重新平衡。
设 v 为当前节点,其右子树 x 在搜索路径上(左子树是对称的)
假设
二进制搜索树(BSTs) 和AVL 树相关推荐
- 数据结构 - 从二叉搜索树说到AVL树(一)之二叉搜索树的操作与详解(Java)
二叉搜索树(Binary Search Tree),简称BST,顾名思义,一颗可以用于搜索的二叉树.BST在数据结构中占有很重要的地位,一些高级树结构都是其的变种,例如AVL树.红黑树等,因此理解BS ...
- 08_Python算法+数据结构笔记-二叉搜索树查询/删除-AVL树旋转/插入/应用-贪心算法
b站视频:路飞IT学城 清华计算机博士带你学习Python算法+数据结构_哔哩哔哩_bilibili #71 二叉搜索树:查询 import randomclass BiTreeNode:def __ ...
- 详解 二叉搜索树-----AVL树
二叉搜索树 根结点比左子树中所有结点都大 根结点比右子树所有结点都小 最小的元素在最左侧 最大的元素在最右侧 中序遍历有序 具有以上的特征的二叉树就是二叉搜索树也叫二叉排序数 二叉搜索树的操作 查找 ...
- 《恋上数据结构第1季》平衡二叉搜索树、AVL树
AVL树 二叉搜索树缺点分析 改进二叉搜索树 平衡(Balance) 理想平衡 如何改进二叉搜索树? 平衡二叉搜索树(Balanced Binary Search Tree) AVL树 BST 对比 ...
- 树、二叉树、AVL树,B树基础学习
树.二叉树.AVL树,B树基础学习 一.树的基本概念 树是一种数据结构,它是由n(n>1)个有限节点组成的一个具有层次关系的集合. 树的基本概念 1.双亲:若有一个结点有子树,那么该结点就称为子 ...
- AVL树和红黑树区别
二叉查找树: 二叉查找树就是左结点小于根节点,右结点大于根节点的一种排序树,也叫二叉搜索树.也叫BST.二叉查找树比普通树查找更快,查找.插入.删除的时间复杂度为O(logN).但是二叉查找树有一种极 ...
- 2021- 10 -13 AVL树的平衡调整(有parent指针) 代码逻辑
AVL平衡调整步骤: 代码写的十分潦草而且没经过测试,看个乐,我认为应该重点看一下没有parent指针的版本,以及我认为这里重点在于理解过程. 插入结点 找到 插入节点的 的第一个 不平衡的 非父祖先 ...
- 2021-10-11 ! AVL树 及其平衡调整 四种情况 恋上数据结构笔记 (考过)
b站有个up讲的很详细 https://www.bilibili.com/video/BV1xE411h7dd?from=search&seid=11383601726930144190&am ...
- B树,B+树,红黑树应用场景AVL树,红黑树,B树,B+树,Trie树
B B+运用在file system database这类持续存储结构,同样能保持lon(n)的插入与查询,也需要额外的平衡调节.像mysql的数据库定义是可以指定B+ 索引还是hash索引. C++ ...
- c++《AVL树的概念》《AVL树的插入》《AVL树的旋转》《AVL树的验证》《AVL树的删除》《AVL树的性能》
4.1 AVL树 4.1.1 AVL树的概念 二叉搜索树虽可以缩短查找的效率,**但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当 于在顺序表中搜索元素,效率低下.**因此,两位俄罗斯的 ...
最新文章
- 带花树[一般图最大匹配模板]
- MangoDB使用总结
- mysql char和varchar_MySQL char与varchar的差异
- tomcat错误:The page you tried to access (/manager/login.do) does not exist
- mysql 报错从 新安装
- 为什么推荐做印尼tiktok?
- IIS7.5安全配置研究
- 对携程处理结果表示满意
- CSDN积分获取方法
- Hackintool 3.4.7中文版 (黑苹果必备工具箱神器)
- 学生抗疫HTML网页设计作品 学生疫情网页模板 大学生抗疫感动专题网页设计作业 HTML学生抗疫网站作业设计
- UpdatePanel触发javascript脚本技巧javascript
- 一行脚本批量下载哔哩哔哩视频
- SQL语句进阶学习一(where、通配符、正则表达式、计算字段、数据处理函数、分组数据)
- [深度学习]动手学深度学习笔记-15
- html 表格和表单知识点
- win7计算机名怎么是感叹号,Win7旗舰版系统电脑网络连接不上显示感叹号怎么回事?...
- 使用fsck命令检查并修复linux文件系统
- Abstract Factory模式(抽象工厂模式)
- 华为S5700三层交换机不同VLAN互通