数据结构11————二叉树的定义性质及储存

来源:互联网 发布:mysql sql 表添加字段 编辑:程序博客网 时间:2024/06/05 03:08

数据结构11————二叉树的定义性质及储存

一.内容

1.二叉树的定义

2.二叉树的性质

3.二叉树的存储

二.二叉树的定义

1.形式化定义

二叉树(Binary Tree)是n(n>=0)个节点组成的集合,该集合或者为空集(空二叉树),或者由一个根节点和两颗互不相交的,分别称为根节点的左子树和右子树的二叉树组成

2.举例

如图就是一个典型的二叉树,二叉树T,根节点为A,A的左子树为T1,右子树为T2,同时左右子树都是一个二叉树。
这里写图片描述

3.二叉树的特点

a.每个节点最多右两个节点,所以二叉树中不存在度大于2的节点
b.二叉树的左右子树是有次序的,不可以随意颠倒
c.即使节点只有一个子树,也要区分是左子树,还是右左子树
d.二叉树具有五种基本形态:
  • 空二叉树
  • 只有一个根节点
  • 根节点只有左子树
  • 根节点只有右子树
  • 根节点左右子树都有

小细节:3个节点可以组成几种不同的二叉树?答案是5种

三.二叉树的性质

1. 在二叉树的第i层至多有2^(i-1)个节点

2. 深度为K的二叉树至多有2^K - 1个节点

3. 对任意一颗二叉树T,如果其叶子节点数为n0,度为2的节点为n2,n0=n2+1

证明:设度为节点总数为n,n0是叶子节点(度为0),n1是度为1的节点,n2是度为2的节点。所以有n = n0+n1+n2;
当一个节点为n时,从节点的进入情况看,除每个根节点外,每个节点都有一根连接线进入节点,所以一共有n-1个连接线.从节点的分支看,度为2的节点分支出去两根连接线,度为1的节点分支出去一根连接线.所以有n-1=2n2+n1
综上所述:n=2n2+n1+1=n0+n1+n2,所以有n0=n2+1

4.具有n个节点的完全二叉树的深度为[log2n]+1([X]表示不超过X的最大整数)

5.如果对一颗有n个节点的完全二叉树(其深度为[log2n]+1)的节点按照层序编号(从第一层到第[log2n]+1),每层从左到右),对任一节点i(1<=i<=n)

  • 如果i=1,则节点i是二叉树的根,无双亲;如果i>i,其双亲是节点的[i/2]
  • 如果2i>n,则节点i无左孩子(节点i为叶子节点),否则其左孩子为是节点的2i
    *如果2i+1>b,则节点i无右孩子,否则其右孩子为节点的2i+1

完全二叉树的定义
若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1)的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
这里写图片描述

四.二叉树的存储

二叉树的存储和之前的线性表一样,有两种存储方式,顺序(数组)和链表

1.二叉树的顺序存储结构

将一个完全二叉树按照层次编号,按照编号存入数组中,如图所示

这里写图片描述

对于不是完全二叉树的二叉树,将它也按照二叉树的规则编号,不存在的的节点设置为^ 如图所示

这里写图片描述

缺点,对于一些特殊二叉树特别浪费空间

2.二叉树的链式存储

对于每个节点,为他设计一个数据域,两个指针域,左指针指向它的左孩子,右指针指向它的右孩子。如图所示

这里写图片描述

关于二叉树的遍历和存储代码实现,见下一篇博客

参考资料:<大话数据结构>,<数据结构与算法>