二叉排序树的中序遍历结果是有序的_程序员的进阶课-架构师之路(8)-二叉树...

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/m0_37609579/article/details/99687256

一、计算机科学中的树

96fa72fbd21ee2663ae0f388e9baa037.png


二、二叉树的定义
一棵树,它的每个节点最多只能有两个子节点,此时就叫二叉树。(我们一般在书中试题中见到的树是二叉树,但并不意味着所有的树都是二叉树。如果节点多于两个,我们也称之为多路树)

411a77aa2f0a5e092a4b2cedad3415e8.png

1532f0a2a8ccfa9376dfb5033bdbac57.png

c657c427733b911bcd9bba3e9ff98a55.png

可以看出: 满二叉树一定是完全二叉树;完全二叉树不一定是满二叉树。
如果我们给二叉树加一个额外的条件,就可以得到一种被称作二叉查找树(binary search tree)的特殊二叉树。
二叉查找树要求:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。【左边下边小,右边上边大

941c8c622703742c665e2572e559724b.png


三、二叉查找树的日常操作
PS:二叉树很多,但对我们来说,在实际的应用中,二叉排序树的应用比较多。1.插入新节点
假设我们要为数组 a[] = {10 , 5 , 15 , 6 , 4 , 16 }构建一个二叉排序树,我们按顺序逐个插入元素。

76491bece59dd8de38b0ba537a1de338.png


插入过程是这样的:
如果是空树,则创建一个新节点,新节点作为根,因此以元素10构建的节点为该二叉查找树的根。

  • 插入5,5比10小,与10的左孩子节点进行比较,10的左孩子节点为空,进行插入。
  • 插入15,15比10大,与10的右孩子节点进行比较,10的右孩子节点为空,进行插入。
  • 插入6,6比10小,与10的左孩子节点5比较;6比5大,与5的右孩子节点进行比较,5的右孩子为空,进行插入。
  • 插入4,4比10小,与10的左孩子节点5比较;4比5小,与5的左孩子节点进行比较,5的左孩子为空,进行插入。
  • 插入16,16比10大,与10的右孩子节点15比较;16比15大,与15的右孩子节点进行比较,15的右孩子为空,进行插入。

从这个过程我们可以总结出插入新元素的步骤:

  • 寻找元素合适的插入位置:新元素与当前结点进行比较,若值大于当前结点,则从右子树进行寻找;否则从左子树进行寻找.
  • 找到插入位置之后,以元素的值构建新节点,插入二叉排序树中。

2.遍历平衡二叉树
【百度百科】平衡二叉搜索树,又被称为AVL树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

620ffd80c79390cb0e16280713fac6dd.png


遍历平衡二叉树,就是以某种方式逐个“访问”二叉树的每一个节点。举例说明:

e9c6c56eb5507e206be95c03b00032c9.png


前序遍历

  • 访问根结点中的数据
  • 前序遍历左子树
  • 前序遍历右子树
    前序遍历结果:
    1, 2, 4, 8, 9, 5, 10, 3, 6, 7

中序遍历

  • 中序遍历左子树
  • 访问根结点中的数据
  • 中序遍历右子树
    中序遍历结果:
    8, 4, 9, 2, 10, 5, 1, 6, 3, 7

后序遍历

  • 后序遍历左子树
  • 后序遍历右子树
  • 访问根结点中的数据
    后序遍历结果:
    8, 9, 4, 10, 5, 2, 6, 7, 3, 1

层次遍历

  • 访问根结点中的数据
  • 访问第二层所有结点的数据
  • 访问第三层所有结点的数据
  • ……
    层次遍历结果:
    1, 2, 3, 4, 5, 6, 7, 8, 9, 10

3.删除节点
删除二叉排序树的某个节点有三种情况:

  • 被删除节点同时有左子树与右子树。将前驱节点的值保存在当前结点,继而删除前驱节点。
  • 被删除节点只有左子树或只有右子树。直接用子树替换被删节点。
  • 被删除节点没有子树。可以直接删除节点。

2fa740c8ea6185dd94d41970938a090d.png

4.查找最值元素
二叉排序树的最小值位于其最左节点上;最大值位于其最右节点上

ea46bde75941c88375854569a37bebb8.png


我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!

886de73118a3e72a9ba4e5b40a10d245.png


四、参考资料https://blog.csdn.net/wannuoge4766/article/details/83998377https://www.cnblogs.com/shixiangwan/p/7530015.htmlhttps://www.cnblogs.com/ysocean/p/8032642.htmlhttps://blog.csdn.net/u014634338/article/details/42465089http://www.it610.com/article/3607922.htm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉排序树(Binary Search Tree,BST)是一种特殊的二叉树,它的每个节点的子树的所有节点的值都小于该节点的值,而子树的所有节点的值都大于该节点的值。下面是二叉排序树的实现与基本操作的介绍: 1. 构建二叉排序树: - 首先创建一个空树。 - 依次将元素插入到树,插入时需要保持树的有序性。 2. 插入操作: - 从根节点开始,比较要插入的值与当前节点的值。 - 如果要插入的值小于当前节点的值,则继续在当前节点的子树插入。 - 如果要插入的值大于当前节点的值,则继续在当前节点的子树插入。 - 如果要插入的值等于当前节点的值,则不进行插入操作。 3. 查找操作: - 从根节点开始,比较要查找的值与当前节点的值。 - 如果要查找的值等于当前节点的值,则找到了目标节点。 - 如果要查找的值小于当前节点的值,则继续在当前节点的子树查找。 - 如果要查找的值大于当前节点的值,则继续在当前节点的子树查找。 - 如果遍历到叶子节点仍然没有找到目标节点,则说明目标节点不存在。 4. 删除操作: - 首先找到要删除的节点。 - 如果要删除的节点是叶子节点,则直接删除。 - 如果要删除的节点只有一个子节点,则将子节点替换为要删除的节点。 - 如果要删除的节点有两个子节点,则找到要删除节点的后继节点(子树最小的节点),将后继节点的值替换到要删除的节点,然后删除后继节点。 5. 中序遍历: - 从根节点开始,先遍历子树,然后访问当前节点,最后遍历子树。 - 中序遍历的结果是有序的。 6. 前序遍历: - 从根节点开始,先访问当前节点,然后遍历子树,最后遍历子树。 7. 后序遍历: - 从根节点开始,先遍历子树,然后遍历子树,最后访问当前节点。 8. 层序遍历: - 从根节点开始,按层次遍历树的节点,先访问根节点,然后依次访问每一层的节点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值