欲望以提升热忱,毅力以磨平高山!|

navyum

园龄:4个月粉丝:0关注:0

2.二叉树

二叉树 Binary Tree:

1.特点:

  • 一种非线性数据结构,代表“祖先”与“后代”之间的派生关系
  • 二叉树的基本单元是节点,每个节点至少包含左子节点引用右子节点引用
  • 二叉树中,除叶节点外,其他所有节点都包含子节点和非空子树

2.概念:

名词 解释
根节点(root node) 位于二叉树顶层的节点,没有父节点。
叶节点(leaf node) 没有子节点的节点,其两个指针均指向 None 。
边(edge) 连接两个节点的线段,即节点引用(指针)。
二叉树的高度(height) 从根节点到最远叶节点所经过的边的数量。
节点所在的层(level) 从顶至底递增,根节点所在层为 1 。
节点的度(degree) 节点的子节点的数量。在二叉树中,度的取值范围是 0、1、2 。
节点的深度(depth) 从根节点到该节点所经过的边的数量。
节点的高度(height) 从距离该节点最远的叶节点到该节点所经过的边的数量。
  • 图解:

3.常见二叉树类型:

完美二叉树/满二叉树:

  • 特点:
    • 所有层的节点都被完全填满
    • 叶节点的度为0,其余所有节点的度都为2

完全二叉树:

  • 特点:
    • 只有最底层的节点未被填满,且最底层节点尽量靠左填充

完满二叉树:

  • 特点:
    • 除了叶节点之外,其余所有节点都有两个子节点

平衡二叉树:

  • 特点:
    • 任意节点的左子树和右子树的高度之差绝对值不超过1

4.二叉树的遍历:

层序遍历:

  • 遍历逻辑:从顶部到底部逐层遍历二叉树,并在每一层按照从左到右的顺序访问节点(类比队列,一般用队列实现)
  • 属于广度优先遍历,也称广度优先搜索(breadth-first search, BFS

前序、中序、后序遍历:

  • 遍历逻辑:从顶部到底部逐层遍历二叉树,先走到尽头,再回溯继续(类比递归,一般用递归方式实现)
  • 前序、中序、后序指的是根的打印顺序:根左右、左根右、左右根
  • 都属于深度优先遍历,也称深度优先搜索(depth-first search, DFS

5.二叉搜索树(节点值有序):

  • 特点:
    • 对于根节点,左子树中所有节点的值 < 根节点的值 < 右子树中所有节点的值有序特性
    • 任意节点的左、右子树也是二叉搜索树,即同样满足条件 1
  • 二叉搜索树的查找操作与二分查找算法的工作原理一致,都是每轮排除一半情况。循环次数最多为二叉树的高度,当二叉树平衡时,时间复杂度为O(logn)
  • 二叉搜索树不允许存在重复节点,否则将违反其定义
  • 二叉搜索树的中序遍历的结果序列是升序的

  • 常见操作:
    • 查找节点:
      • 比较待查找值与节点值;查找值小,则继续左子树;查找值大,则继续右子树。知道值匹配或者到达叶子节点
    • 插入节点:
      • 先查找到具体位置,插入到该位置(修改该位置的父节点指针,指向新节点)
    • 删除节点:
      • 删除节点为叶子节点,度为0,可以直接删除
      • 删除节点为非叶子节点:
        • 度为1,用待删除节点的唯一子节点替换掉待删除节点
        • 度为2,用该节点的右子树的最小节点左子树的最大节点(该节点一定是叶子节点),替换自己
          • 右子树的最小节点:中序遍历的下一个节点
          • 左子树的最小节点:中序遍历的最后一个节点

本文作者:navyum

本文链接:https://www.cnblogs.com/navyum/p/18509361

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   navyum  阅读(4)  评论(0编辑  收藏  举报
//自己上传到博客园的js
点击右上角即可分享
微信分享提示