数据结构 - 2 树 - 2 二叉树

二叉树定义

二叉树(英语:Binary tree)是每个节点最多只有两个分支(即不存在分支度大于2的节点)的树结构。通常分支被称作“左子树”或“右子树”。二叉树的分支具有左右次序,不能随意颠倒。

二叉树是递归定义的,其节点有左右子树之分,逻辑上二叉树有五种基本形态:
(1)空二叉树——如图a;
(2)只有一个根节点的二叉树——如图b;
(3)只有左子树——如图c;
(4)只有右子树——如图d;
(5)完全二叉树——如图e。
二叉树


二叉树性质

  • 在非空二叉树中,二叉树的第i层至多拥有2i-1个节点;
  • 深度为k的二叉树最多有2k-1个节点(定义根节点所在深度 k0),而总计拥有节点数符合的,称为满二叉树;最少有k个节点;
  • 对任何一棵非空的二叉树T,如果其叶片(终端节点)数为n0,分支度为2的节点数为n2,则n0=n2+1。
  • 深度为k有n个节点的二叉树,当且仅当其中的每一节点,都可以和同样深度k的满二叉树,序号为1到n的节点一对一对应时,称为完全二叉树
  • 具有n个节点的完全二叉树的深度为 ⌊ log ⁡ 2 n ⌋ + 1 \lfloor\log_2n\rfloor+1 log2n+1
  • 给定n个节点,能构成h(n)种不同的二叉树。
    h(n)为卡特兰数的第n项。 h ( n ) = C 2 n n n + 1 h(n)=\frac{C_{2n}^n}{n+1} h(n)=n+1C2nn

特殊的二叉树

满二叉树(full binary tree)

如果每个内部节点(非叶节点)都包含两个孩子,就成为满二叉树。
满二叉树

完美二叉树(perfect binary tree)

当所有的叶子节点都在同一层就是完美二叉树,毫无间隙填充了 k 层。
完美二叉树

完全二叉树(complete binary tree)

当一个高度为 k 的完美二叉树减少到 k-1,并且最底层的槽被毫无间隙地从左到右填充,称为完全二叉树。
完全二叉树

存储结构

顺序存储表示

二叉树可以用数组或链接串列来存储,若是满二叉树就能紧凑排列而不浪费空间。
树的顺序存储结构
如果某个节点的索引为i,(假设根节点的索引为0)则在它左子节点的索引会是2i+1,以及右子节点会是2i+2。
而它的父节点(如果有)索引则为 ⌊ i − 1 2 ⌋ \left\lfloor {\frac {i-1}{2}}\right\rfloor 2i1

优点:
有利于紧凑存储和更好的访问的局部性,特别是在前序遍历中。
缺点:
它需要连续的存储空间,这样在存储高度为h的n个节点所组成的一般树时,将浪费很多空间。在最糟糕的情况下,如果深度为h的二叉树其每个节点都只有右孩子,则该存储结构需要占用2h-1的空间,实际上却有h个节点,浪费了不少空间。

二叉链表存储表示

二叉树通常用树节点结构来存储。有时也包含指向唯一的父节点的指针。如果一个节点的子节点个数小于2,一些子节点指针可能为空值,或者为特殊的哨兵节点。 使用链表能避免顺序存储浪费空间的问题,算法和结构相对简单,但使用二叉链表,由于缺乏父链的指引,在找回父节点时需要重新扫描树得知父节点的节点地址。

树的二叉链表存储

三叉链表存储表示

改进于二叉链表,增加父节点的指引,能更好地实现节点间的访问,不过算法相对复杂。 当二叉树用三叉链表表示时,有N个节点,就会有N+2个空指针。
树的三叉链表存储

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值