二叉树

图片和部分文字来源于(https://www.jianshu.com/p/bf73c8d50dc2

1. 重点概念

  1. 节点
    节点是数据结构中的基础,是构成复杂数据结构的基本组成单位


  2. 是 n (n >= 0) 个结点的有限集,当 n = 0 时称为空树,在任意一颗非空树中:

    1. 有且仅有一个特定的节点称为根节点 (Root)
    2. 当 n > 1 时,其余节点可分为 m (m > 0) 个互不相交的有限集 T1、T2、T3、… 、Tn,其中么一个集合本身也是一棵树,称为根的子树
      一颗普通的树
  3. 节点的度
    节点拥有的子树数目称为该节点的 度

  4. 节点关系

    1. 孩子节点
      某一节点拥有的子树的根节点为该节点的孩子节点(在上图中,B、C 节点为 A 节点的孩子节点)
    2. 双亲节点
      相应的,拥有子树的根节点的节点为该节点的双亲节点(在上图中,A 节点为 B、C 节点的双亲节点)
    3. 兄弟节点
      同一个双亲结点的孩子节点之间互称兄弟节点(在上图中,B 节点与 C 节点互称兄弟节点)
    4. 叶子节点
      没有孩子节点的节点称为叶子节点
    5. 节点层次
      从一颗树的根节点开始计算,根节点为第一层,其孩子节点为第二层,以此类推

    节点层次

  5. 树的深度
    树的最高层数为树的深度,在上图中,树的深度为4

2. 二叉树

  1. 定义
    二叉树是每个节点最多有两个孩子节点的树,或者为空树(此时称为空二叉树)

  2. 特点

    • 每个节点最多有两颗子树,也就是最多有两个孩子节点,所以树中不可能出现度大于2的节点
    • 其左子树和右子树是有顺序的,次序不能颠倒
    • 即时只有一颗子树也要区分左右
    • 在二叉树的第 i 层上,最多拥有 2^(i-1) 个节点
    • 二叉树的深度为 k ,那么此树最有拥有 2^k-1 个节点
  3. 满二叉树

    在一棵二叉树中,如果节点都拥有左子树和右子树,并且所有叶子节点都存在于同一层上,这样的二叉树称为满二叉树。其特点:

    • 叶子节点只能出现在最下一层
    • 非叶子节点的度一定是2
    • 在同样深度的二叉树中,满二叉树的节点个数是最多的,叶子数也是最多的

    满二叉树

  4. 完全二叉树

    对一颗深度为 k 的,有 n 个节点的二叉树,当且仅当其每一个节点都与深度为 k 的满二叉树中编号从1 至 n 的节点一一对应时称之为完全二叉树。其特点:

    • 叶子节点只能出现在最下层和次下层
    • 最下层的叶子节点出现在左侧
    • 次下层的叶子节点出现在右侧
    • 如果节点的度为 1,那么此节点只拥有左子树
    • 满二叉树一定是完全二叉树,反之不成立

    完全二叉树

  5. 顺序存储

    二叉树的顺序存储结构就是使用一维数组存储二叉树中的节点,并且节点的存储位置就是数组的下标引索

    顺序存储

顺序存储

3. 二叉树遍历

二叉树的遍历时至从二叉树的根节点出发,按照某种次序一次访问二叉树中的所有系欸按,使得二叉树中每个节点被访问有且只有一次,二叉树的访问顺序次序可以分为四种:

  • 前序遍历
  • 中序遍历
  • 后序遍历
  • 层序遍历
  1. 前序遍历

    前序遍历通俗地说就是从根节点开始,先遍历完左侧再遍历右侧,每当第一次到达一个节点时就输出节点存储的数据,即使抵达了叶子节点,仍要寻找子节点,试图遍历(这句话再中序遍历和后续遍历中能显示)

    前序遍历

    1. 从根节点出发,第一次抵达A,输出A
    2. 从左往右,第一次抵达B,输出B
    3. B有左子树,继续往下,第一次抵达D,输出D
    4. D有左子树,继续往下,第一次抵达H,输出H
    5. H没有左子树,返回D,第二次抵达D,D还有右树,第一次抵达I,输出I
    6. I没有左子树,返回D,第三次抵达D,返回B,第二次抵达B,B有右子树,第一次抵达E,输出E
    7. E还有左子树,继续往下,第一次抵达J,输出J
    8. J没有左子树,返回E,第三次抵达E,返回B,第三次抵达B,返回A,第二次抵达A,A还有右子树,第一次抵达C,输出C
    9. C还有左子树,继续往下,抵达F,输出F
    10. F没有左子树,返回C,第二次抵达C,C还有右子树,第一次抵达G

    结果为:ABDHIEJCFG

  2. 中序遍历

    中序遍历通俗地说就是从二叉树的根节点出发,先遍历完左侧再遍历右侧,当第二次到达节点时就输出数据,即使抵达了叶子节点,仍要寻找子节点,试图遍历

    中序遍历

    1. 从根节点出发,第一次抵达A,继续往下
    2. 第一次抵达B,继续往下
    3. 第一次抵达D,继续往下
    4. 第一次抵达H,H的左子树为空,返回H,第二次抵达H,输出H
    5. 返回D,第二次抵达D,输出D
    6. D还有右子节点,第一次抵达I,I的左子树为空,返回I,第二次抵达I,输出I
    7. 返回D,第三次抵达D,返回B
    8. 第二次抵达B,输出B
    9. B还有右子树,第一次抵达E,继续往下
    10. 第一次抵达J,J的左子树为空,返回J,第二次抵达J,输出J
    11. 返回E,第二次抵达E,输出E
    12. 返回B,第三次抵达B,返回A
    13. 第二次抵达A,输出A
    14. A还有还有右子树,第一次抵达C,继续往下
    15. 第一次抵达F,F的左子树为空,返回F,第二次抵达F,输出F
    16. 返回C,第二次抵达C,输出C
    17. C还有右子树,继续往下
    18. 第一次抵达G,G的左子树为空,返回G,第二次抵达G,输出G

    结果为:HDIBJEAFCG

  3. 后序遍历

    中序遍历通俗地说就是从二叉树的根节点出发,先遍历完左侧再遍历右侧,当第三次到达节点时就输出数据,即使抵达了叶子节点,仍要寻找子节点,试图遍历

    后序遍历

    1. 从根节点出发,第一次抵达A,继续往下
    2. 第一次抵达B,B有孩子节点,继续往下
    3. 第一次抵达D,D有孩子节点,继续往下
    4. 第一次抵达H,H没有左子树,返回H,第二次抵达H,H没有右子树,返回H,第三次抵达H,输出H
    5. 返回D,第二次抵达D,D有右子节点,继续往下
    6. 第一次抵达I,I没有左子树,返回I,第二次抵达I,I没有右子树,返回I,第三次抵达I,输出I
    7. 返回D,第三次抵达D,输出D
    8. 返回B,第二次抵达B,B有右子节点,继续往下
    9. 第一次抵达E,E有孩子节点,继续往下
    10. 第一次抵达J,J没有左子树,返回J,第二次抵达J,J没有右子树,返回J,第三次抵达J,输出J
    11. 返回E,第二次抵达E,E没有右子树,返回E,第三次抵达E,输出E
    12. 返回B,第三次抵达B,输出B
    13. 返回A,第二次抵达A,A有右子树,继续往下
    14. 第一次抵达C,C有左子树,继续往下
    15. 第一次抵达F,F没有左子树,返回F,第二次抵达F,F没有右子树,返回F,第三次抵达F,输出F
    16. 返回C,第二次抵达C,C有右子树,继续往下
    17. 第一次抵达G,G没有左子树,返回G,第二次抵达G,G没有右子树,返回G,第三次抵达G,输出G
    18. 返回C,第三次抵达C,输出C
    19. 返回A,第三次抵达A,输出A

    结果:HDJEBFGCA

  4. 层序遍历

    层序遍历就是按照树的层次自上而下遍历

    结果:ABCDEFGHIJ

4. 考点

  1. 已知前序遍历和中序遍历,确定一颗二叉树

    若一颗二叉树的前序遍历为ABCDEF,中序遍历为CBAEDF,求这棵二叉树?

    分析:前序遍历第一个节点为根节点,所以我们得到根节点为A,中序遍历根节点位语序列中间,所以此二叉树的左子树有CB节点,右子树有EDF节点

    分析1

    同理对于CB,我们得到C为B的双亲节点,B为叶子节点;对于DEF,我们得到D为EF的双亲节点,E为左节点,F为右节点

    分析2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值