数据结构-树和二叉树-基本概念

树和二叉树基本概念

  • 树是由一个集合以及在该集合上定义的一种关系构成的
  • 集合中的元素称为树的结点,所定义的关系称为父子关系
  • 父子关系在树的结点之间建立了一个层次结构
  • 树的结点包含一个数据元素指向其子树的若干分支
  • 根结点具有特殊地位,简称为

image

树(tree)是n(n>=0)个结点的有限集

  • 或者是一个空树(n=0),空树中不包含任何结点
  • 或者是一棵非空树(n>0),此时有且仅有一个称为根的特定的结点

结点的度与树的度

  • 结点拥有的子树的数目称为结点的度(Degree)
  • 度为0的结点称为叶子(leaf)结点终端结点
  • 度不为0的结点称为非终端结点或分支结点。除根之外的分支结点也称为内部结点
  • 树内各结点的度的最大值称为树的度

image

结点的层次和树的深度

  • 结点的层次(level)从根开始定义,根结点层次为1,其子树层次为2
  • 树中的最大层次数称为数的深度(Depth)高度

image

父亲、儿子、兄弟

  • 父亲(parent):一个结点的直接前驱结点
  • 儿子(child):一个结点的直接后继结点
  • 兄弟(sibling):同一个父亲结点的其他结点

祖先、子孙、堂兄弟

  • 祖先:从根到该结点的路径上的所有结点
  • 子孙以某结点为根的树中的任一结点都是该结点的子孙
  • 堂兄弟父亲结点在同一层次的结点

有序树、m叉树、森林

  • 有序树:树中结点的各子树从左至右看成有顺序的(若不特指说明,一般讨论的都是有序树)
  • 无序树:不考虑子树的顺序
  • m叉树:树中所有结点的最大度为m的有序树
  • 森林:m(m>=0)棵互不相交的树的集合

二叉树

  • 每个结点的度均不超过2的有序树,称为二叉树(binary tree)
  • 二叉树或者是一棵空树,或者是由一个根结点和两个互不相交的左子树右子树组成的非空树

image

满二叉树

  • 高度为k并且有$2^k+1$ 个结点的二叉树
  • 满二叉树中每层都达到最大数,即每层结点都是满的

完全二叉树

  • 在一棵满二叉树中,从最下层最右侧起,去掉相邻的若干叶子节点,得到的即为完全二叉树
  • 满二叉树一定是完全二叉树,而完全二叉树不一定是满二叉树

image

二叉树的性质

  1. 在二叉树的第i层上,最多有$2^(n-1)$个结点(根是第1层)
  2. 高度为h的二叉数至多有$2^h$-1个结点
  3. 对于任意一棵二叉树,叶子节点数 = 度为2的结点数 + 1
  4. 有n个结点的完全二叉树的高度为$log_2^n$+1,其中$log_2^n$是向下取整
  5. 含有n>=1个结点的二叉树高度至多为n-1;高度至少为$log_2^n$+1,其中$log_2^n$是向下取整
  6. 如果对一棵含有n个结点的完全二叉树的结点进行编号,则对任意结点i

    1. 如果i=1,则结点i是二叉树的根;如果i>1,则其双亲结点为i/2向下取整
    2. 如果2i>n,则结点i无左孩子;否则其左孩子为2i
    3. 如果2i+1>n,则结点i无右孩子;否则其右孩子为2i+1

二叉树的存储结构

二叉树的存储结构有两种:顺序存储结构链式存储结构

顺序存储结构

  • 对于满二叉树完全二叉树来说,可以将其存储在一组连续的存储单元中
  • 用一维数组来实现顺序存储结构时,将二叉树第i个结点存放到数组中第i个分量中
  • 根据二叉树的性质,可以得到结点i的父结点、左右孩子结点分别存放在i/2、2i、2i+1分量中
  • image
  • 这种存储方式对于满二叉树完全二叉树非常合适并且高效方便的,因为满二叉树和完全二叉树采用顺序存储结构即不浪费空间,也能根据公式很快确定结点之间的关系
  • 但是对于一般的二叉树而言,必须用“虚结点”将一棵二叉树补成一棵完全二叉树来存储,否则无法确定结点之间的前驱后继关系,但是这样就会造成空间的浪费
  • image

链式存储结构

  • 设计不同的节点结构可构成不同的链式存储结构
  • 在二叉树中,每个结点都有两个孩子,则可以设计成每个结点至少包含3个域:数据域、左孩子域、右孩子域
  • 利用此结构得到的二叉树存储结构称为二叉链表。数据域存放数据元素,左孩子域存放指向左孩子结点的指针,右孩子域存放指向右孩子的指针
  • 为了方便找到父结点,可以在上述结点结构中添加一个指针域指向结点的父结点,采用此结构得到的存储结构称为三叉链表
  • image
阅读 150

推荐阅读