跳到主要内容

二叉树

1. 基本概念

1.1 树

树形结构是一中一对多的结构,而之前的链式结构是一对一的。

树(Tree)是 n (n >=0) 个结点的有限集合。n=0 时称为空树。

在任意一棵非空树中:

  • 有且仅有一个特定的称为根(Root)的结点。
  • 当 n>1 时,其余结点可分为 m(m>0) 个互不相交的有限集。
  • 每一个集合本身又是一棵树,并且称为根的子树(SubTree)。

Zja6N1.png

1.2 结点分类

  • 结点拥有的子树称为结点的度(Degree)。
  • 度为 0 的结点称为叶结点(Leaf)或终端结点。度不为 0 的结点称为非终端结点或分支结点。
  • 分支结点也叫做内部结点(除根结点)。
  • 树的度是树内各结点的度的最大值。

Zja8jK.png

1.3 结点间关系

  • 结点的子树的根被称为该结点的孩子,该结点称为孩子的双亲。
  • 同一个双亲的孩子之间互称兄弟。
  • 结点的祖先是从根到该结点所经分支上的所有结点。
  • 以某结点为根的子树中的任一结点都称为该结点的子孙。

ZjauAu.png

2. 二叉树概念

2.1 二叉树特点

  • 二叉树(Binary Tree),是一种树型结构,它的特点是每个结点至多只有两棵子树,并且二叉树的子树有左右之分,其次序不能颠倒。

  • 二叉树有基本五种形态:空二叉树、只有一个根节点、根结点只有左子树、根结点只有右子树、根结点既有左子树也有右子树。

  • 三个结点二叉树也是有五种形态的,因为二叉树是区分左右顺序的。

Zj15uE.png

2.2 特殊二叉树

斜树

  • 左斜树:所有的结点都只有左子树。
  • 右斜树:所有的结点都只有右子树。

满二叉树

  • 所有的分支结点都存在左子树和右子树。

  • 叶子只能出现在最下一层,出现在其他层不能达成平衡。

  • 非叶子结点的度一定是2。

  • 在同样深度的二叉树中,满二叉树的结点个数最多,叶子树最多。

Zj1tlh.png

完全二叉树

  • 除去最后一层后就变成满二叉树。
  • 最后一层的结点必须依次从左往右边排。
  • 叶子结点只能出现在最下两层。
  • 最下层的叶子一定集中在左部连续位置。
  • 倒数二层,若有叶子结点,一定都在右部连续位置。
  • 如果结点度为1,则该结点只有左孩子,不存在右子树的情况。
  • 同样结点树的二叉树,完全二叉树深度最小。

Zj1s3m.png

2.4 二叉树的性质

  • 在二叉树的第 i 层上至多有 2^( i-1 ) 个结点(i >= 1)。
  • 深度为 k 的二叉树至多有 ( 2^k ) - 1 个结点。
  • 任何一颗二叉树 T,如果其终端结点树为 n0,度为 2 的结点树为 n2,则 n0 = n2 + 1。
  • 具有 n 个结点的完全二叉树的深度为 ( log2n )+1 向下取整。
  • 若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点:
    • 若 i=1,则该结点是二叉树的根,无双亲。否则,编号为 [i/2] 的结点为其双亲结点;
    • 若 2i>n,则该结点无左孩子。否则,编号为 2i 的结点为其左孩子结点;
    • 若 2i+1>n,则该结点无右孩子结点。否则,编号为2i+1 的结点为其右孩子结点。

2.5 二叉树的存储结构

二叉树的存储结构有一样有顺序存储和线性存储。

  • 顺序存储结构

二叉树的顺序存储结构就是把一个普通的二叉树,填补成一棵完全二叉树,然后自上而下,自左到右,按1到n编号,然后依次把数据保存到数组里。

顺序存储结构的二叉树会对存储空间造成极大的浪费,所以顺序存储结构一般只用于完全二叉树。

ZjeI8D.png

  • 链式存储结构

链式存储结构就是利用指针的指向关系把每个结点链接起来,以构成逻辑上的树状结构,可以更合理的利用内存空间。所以它也叫做二叉链表。

2.6 二叉树的遍历

二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次。

二叉树的遍历有四种方式:

  • 前序遍历

规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再谦前序遍历右子树,如图遍历顺序为:ABDGHCEIF。

ZjE48o.png

  • 中序遍历

规则是若树木为空,则空操作返回,否则从根结点开始(不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后遍历右子树木。如图遍历顺序为:GDHBAEICF。

ZjEtMb.png

  • 后序遍历

规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点。如图遍历顺序为:GHDBIEFCA。

ZjEs3K.png

  • 层序遍历

规则是若树为空,则空操作返回,否则从树的第一层,也就是根结点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问。

ZjEJV1.png

冒泡排序

冒泡排序是一种简单的交换排序。

基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。