本文记述了二叉树的基本概念、表示法、性质和操作。
◆ 概念
二叉树(以下也简称树)是一种存放多个元素的数据结构。每个元素称为结点,每个结点有左、右两个链接,每个链接要么指向其他结点,要么是空链接。
某个结点是它的左、右链接指向的结点的父结点,被指向的结点是其父结点的左或右子结点。没有父结点的结点称为根结点,没有子结点的结点称为叶子结点。
由于结点指向结点的递归特性,所以某个结点(X)的左、右子结点及后者递归指向的所有结点构成了以该结点(X)为根结点的左、右子树,且这两棵子树不相交。
从根结点到某个结点的路径称为内部路径。内部路径上的链接的数量为内部路径的长度。将一棵树中所有的内部路径长度加起来,就得到整棵树的内部路径长度。从根结点到某个叶子结点的空链接的路径称为外部路径。外部路径上的链接的数量为外部路径的长度。将一棵树中所有的外部路径长度加起来,就得到整棵树的外部路径长度。
以某个结点为终点的内部路径的长度,也称为此结点的深度或高度(【注】有的文章将该长度加 1 作为结点的深度,请读者注意其中的差异)。所有结点的最大深度为二叉树的深度。
从根结点到叶子结点的路径上,依次给每个结点指定层号,根结点为第 1 层,根结点的子结点为第 2 层,依次类推。最后一层的层号为二叉树的层数。
所有叶子结点的深度都相同,且所有的非叶子结点都有两个子结点,这样的二叉树称为满二叉树。
从第一层到倒数第二层是满二叉树,且最后一层的所有结点都在此层左侧,这样的二叉树称为完全二叉树。
树中的任意结点要么有两个子结点要么没有子结点,这样的二叉树称为完满二叉树。
◆ 表示
二叉树常用倒置的树状形式直观地表示出来,如下图示例,
如果用层次法从上到下、从左到右对一棵满二叉树的结点连续编号,则编号为 k 的结点,其父结点的编号为 ⎣k/2⎦,其子结点的位置为 2k 和 2k+1。对于非满二叉树,可以考虑将没有结点的位置标注为空,这种顺序形式表示出来,如下图所示,
◆ 性质
- 性质 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 :二叉树的外部路径长度比其内部路径长度多 2N 。
◆ 操作
二叉树的基本操作是遍历,即按照某种规则访问树中的每个结点一次。通常有前序遍历、中序遍历、后序遍历和层次遍历。
树的前序遍历操作为:
- 访问树的根结点;
- 前序遍历根结点的左子树(若有);
- 前序遍历根结点的右子树(若有)。
对于前述“一般形态二叉树”的树状形式和顺序形式的前序遍历过程,如下图所示,
树的中序遍历操作为:
- 中序遍历根结点的左子树(若有);
- 访问树的根结点;
- 中序遍历根结点的右子树(若有)。
对于上述例子的中序遍历过程,如下图所示,
树的后序遍历操作为:
- 中序遍历根结点的左子树(若有);
- 中序遍历根结点的右子树(若有);
- 访问树的根结点。
对于上述例子的后序遍历过程,如下图所示,
树的层次遍历操作为:
- 访问树的根结点;
- 从左到右访问树的第 2 层的所有结点;
- 从左到右访问树的第 i 层的所有结点,直到最后一层。
对于上述例子的层次遍历过程,如下图所示,
◆ 最后
写作过程中,笔者参考了《算法(第4版)》、软件设计师教程(第2版、Wolfram Mathworld。致各位作者。
标签:结点,遍历,中序,路径,表示法,概念,二叉树,长度 From: https://www.cnblogs.com/green-cnblogs/p/18451096