二进制搜索树(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 树相关推荐

  1. 数据结构 - 从二叉搜索树说到AVL树(一)之二叉搜索树的操作与详解(Java)

    二叉搜索树(Binary Search Tree),简称BST,顾名思义,一颗可以用于搜索的二叉树.BST在数据结构中占有很重要的地位,一些高级树结构都是其的变种,例如AVL树.红黑树等,因此理解BS ...

  2. 08_Python算法+数据结构笔记-二叉搜索树查询/删除-AVL树旋转/插入/应用-贪心算法

    b站视频:路飞IT学城 清华计算机博士带你学习Python算法+数据结构_哔哩哔哩_bilibili #71 二叉搜索树:查询 import randomclass BiTreeNode:def __ ...

  3. 详解 二叉搜索树-----AVL树

    二叉搜索树 根结点比左子树中所有结点都大 根结点比右子树所有结点都小 最小的元素在最左侧 最大的元素在最右侧 中序遍历有序 具有以上的特征的二叉树就是二叉搜索树也叫二叉排序数 二叉搜索树的操作 查找 ...

  4. 《恋上数据结构第1季》平衡二叉搜索树、AVL树

    AVL树 二叉搜索树缺点分析 改进二叉搜索树 平衡(Balance) 理想平衡 如何改进二叉搜索树? 平衡二叉搜索树(Balanced Binary Search Tree) AVL树 BST 对比 ...

  5. 树、二叉树、AVL树,B树基础学习

    树.二叉树.AVL树,B树基础学习 一.树的基本概念 树是一种数据结构,它是由n(n>1)个有限节点组成的一个具有层次关系的集合. 树的基本概念 1.双亲:若有一个结点有子树,那么该结点就称为子 ...

  6. AVL树和红黑树区别

    二叉查找树: 二叉查找树就是左结点小于根节点,右结点大于根节点的一种排序树,也叫二叉搜索树.也叫BST.二叉查找树比普通树查找更快,查找.插入.删除的时间复杂度为O(logN).但是二叉查找树有一种极 ...

  7. 2021- 10 -13 AVL树的平衡调整(有parent指针) 代码逻辑

    AVL平衡调整步骤: 代码写的十分潦草而且没经过测试,看个乐,我认为应该重点看一下没有parent指针的版本,以及我认为这里重点在于理解过程. 插入结点 找到 插入节点的 的第一个 不平衡的 非父祖先 ...

  8. 2021-10-11 ! AVL树 及其平衡调整 四种情况 恋上数据结构笔记 (考过)

    b站有个up讲的很详细 https://www.bilibili.com/video/BV1xE411h7dd?from=search&seid=11383601726930144190&am ...

  9. B树,B+树,红黑树应用场景AVL树,红黑树,B树,B+树,Trie树

    B B+运用在file system database这类持续存储结构,同样能保持lon(n)的插入与查询,也需要额外的平衡调节.像mysql的数据库定义是可以指定B+ 索引还是hash索引. C++ ...

  10. c++《AVL树的概念》《AVL树的插入》《AVL树的旋转》《AVL树的验证》《AVL树的删除》《AVL树的性能》

    4.1 AVL树 4.1.1 AVL树的概念 二叉搜索树虽可以缩短查找的效率,**但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当 于在顺序表中搜索元素,效率低下.**因此,两位俄罗斯的 ...

最新文章

  1. 带花树[一般图最大匹配模板]
  2. MangoDB使用总结
  3. mysql char和varchar_MySQL char与varchar的差异
  4. tomcat错误:The page you tried to access (/manager/login.do) does not exist
  5. mysql 报错从 新安装
  6. 为什么推荐做印尼tiktok?
  7. IIS7.5安全配置研究
  8. 对携程处理结果表示满意
  9. CSDN积分获取方法
  10. Hackintool 3.4.7中文版 (黑苹果必备工具箱神器)
  11. 学生抗疫HTML网页设计作品 学生疫情网页模板 大学生抗疫感动专题网页设计作业 HTML学生抗疫网站作业设计
  12. UpdatePanel触发javascript脚本技巧javascript
  13. 一行脚本批量下载哔哩哔哩视频
  14. SQL语句进阶学习一(where、通配符、正则表达式、计算字段、数据处理函数、分组数据)
  15. [深度学习]动手学深度学习笔记-15
  16. html 表格和表单知识点
  17. win7计算机名怎么是感叹号,Win7旗舰版系统电脑网络连接不上显示感叹号怎么回事?...
  18. 使用fsck命令检查并修复linux文件系统
  19. Abstract Factory模式(抽象工厂模式)
  20. 华为S5700三层交换机不同VLAN互通

热门文章

  1. 1.13 08特殊日历计算
  2. ArduinoUNO实战-第十四章-LM35温度传感器和DS18B20温度传感器
  3. 织梦dedecms调用热门搜索关键词的方法
  4. RFC822邮件格式
  5. 什么是LTE CAT1和CATM
  6. php excel多级下拉菜单自动生成,Excel下拉菜单怎么做 多级联动+自动匹配教程
  7. (干货)五种知网文献免费下载方式
  8. Redis 分布式并发防止脏读
  9. 常用的颜色色值(转)
  10. html版权登记怎么打,版权符号怎么输入_Html版权符号怎么打