二叉树的概念、表示法、性质和操作

本文记述了二叉树的基本概念、表示法、性质和操作。

◆ 概念

二叉树(以下也简称树)是一种存放多个元素的数据结构。每个元素称为结点,每个结点有左、右两个链接,每个链接要么指向其他结点,要么是空链接。

某个结点是它的左、右链接指向的结点的父结点,被指向的结点是其父结点的左或右子结点。没有父结点的结点称为根结点,没有子结点的结点称为叶子结点。

由于结点指向结点的递归特性,所以某个结点(X)的左、右子结点及后者递归指向的所有结点构成了以该结点(X)为根结点的左、右子树,且这两棵子树不相交。

从根结点到某个结点的路径称为内部路径。内部路径上的链接的数量为内部路径的长度。将一棵树中所有的内部路径长度加起来,就得到整棵树的内部路径长度。从根结点到某个叶子结点的空链接的路径称为外部路径。外部路径上的链接的数量为外部路径的长度。将一棵树中所有的外部路径长度加起来,就得到整棵树的外部路径长度。

以某个结点为终点的内部路径的长度,也称为此结点的深度或高度(【注】有的文章将该长度加 1 作为结点的深度,请读者注意其中的差异)。所有结点的最大深度为二叉树的深度。

从根结点到叶子结点的路径上,依次给每个结点指定层号,根结点为第 1 层,根结点的子结点为第 2 层,依次类推。最后一层的层号为二叉树的层数。

所有叶子结点的深度都相同,且所有的非叶子结点都有两个子结点,这样的二叉树称为满二叉树。

从第一层到倒数第二层是满二叉树,且最后一层的所有结点都在此层左侧,这样的二叉树称为完全二叉树。

树中的任意结点要么有两个子结点要么没有子结点,这样的二叉树称为完满二叉树。

◆ 表示

二叉树常用倒置的树状形式直观地表示出来,如下图示例,

figure1


figure2


figure3


figure4


figure5

如果用层次法从上到下、从左到右对一棵满二叉树的结点连续编号,则编号为 k 的结点,其父结点的编号为 ⎣k/2⎦,其子结点的位置为 2k 和 2k+1。对于非满二叉树,可以考虑将没有结点的位置标注为空,这种顺序形式表示出来,如下图所示,

figure6


figure7

◆ 性质

  • 性质 1 :二叉树的第 i (≥ 1) 层上至多有 2^(i-1) 个结点。
  • 性质 2 :深度为 h (≥ 0) 的二叉树至多有 2^(h+1) - 1 个结点。
  • 性质 3 :二叉树中,叶子结点的个数比同时有左右子结点的结点的个数多 1 。
  • 性质 4 :有 N 个结点的完全二叉树的深度为 ⎣lg(N)⎦。 (lg 为以 2 为底的对数)
  • 性质 5 :完全二叉树中编号为 k (≥ 1) 的结点,若有父结点,其父结点的编号为 ⎣k/2⎦;若有子节点,其左右子结点的位置为 2k 和 2k+1。
  • 性质 6 :有 N 个结点的二叉树的外部路径长度比其内部路径长度多 2N 。

◆ 操作

二叉树的基本操作是遍历,即按照某种规则访问树中的每个结点一次。通常有前序遍历、中序遍历、后序遍历和层次遍历。

树的前序遍历操作为:

  1. 访问树的根结点;
  2. 前序遍历根结点的左子树(若有);
  3. 前序遍历根结点的右子树(若有)。

对于前述“一般形态二叉树”的树状形式和顺序形式的前序遍历过程,如下图所示,

figure8


figure9

树的中序遍历操作为:

  1. 中序遍历根结点的左子树(若有);
  2. 访问树的根结点;
  3. 中序遍历根结点的右子树(若有)。

对于上述例子的中序遍历过程,如下图所示,

figure10


figure11

树的后序遍历操作为:

  1. 中序遍历根结点的左子树(若有);
  2. 中序遍历根结点的右子树(若有);
  3. 访问树的根结点。

对于上述例子的后序遍历过程,如下图所示,

figure12


figure13

树的层次遍历操作为:

  1. 访问树的根结点;
  2. 从左到右访问树的第 2 层的所有结点;
  3. 从左到右访问树的第 i 层的所有结点,直到最后一层。

对于上述例子的层次遍历过程,如下图所示,

figure14


figure15

◆ 最后

写作过程中,笔者参考了《算法(第4版)》软件设计师教程(第2版)Wolfram Mathworld。致各位作者。

posted @ 2024-10-08 17:39  green-cnblogs  阅读(25)  评论(0编辑  收藏  举报