树的定义
树是由 n(n≥0) 个结点组成的有限集合。如果n=0,称为空树;
如果n>0,则:
- 有一个特定的称之为根的节点,它只有直接后继,但没有直接前驱;
- 除根以外的其他节点划分为m((m≥0)个互不相交的有限集合T0,T1,…Tm-1,每个集合又是一棵树,并且称之为根的子树。每个子树的根节点有且只有一个直接前驱,但可以有0个或多个直接后继。
有关树的基本概念
-
节点的度:一个节点含有的子树的个数称为该节点的度。
-
叶节点或终端节点:度为0的节点称为叶节点;
-
非终端节点或分支节点:度不为0的节点;
-
双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
-
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
-
兄弟节点:具有相同父节点的节点互称为兄弟节点;
-
树的度:一棵树中,最大的节点的度称为树的度;
-
节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
-
树的高度或深度:树中节点的最大层次;
-
堂兄弟节点:双亲在同一层的节点互为堂兄弟;
-
节点的祖先:从根到该节点所经分支上的所有节点;
-
子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
-
森林:由 m(m≥0) m(m≥0)m(m≥0) 棵互不相交的树的集合称为森林。
二叉树的定义
一棵二叉树是结点的一个有限集合,该集合或者为空,或者是由一个根结点加上两棵分别称为左子树和右子树的、互不相交的二叉树组成。
满二叉树
在一棵二叉树中,如果所有分支节点都存在左子树和右子树,并且所有的叶子节点都在同一层上,这样的二叉树称为 " 满二叉树 "。
单是每个结点都存在左右子树,不能算是满二叉树,还必须要所有的叶子结点都在同一层上,这就做到了整棵树的平衡。因此,满二叉树的特点有:
- 叶子只能出现在最下一层。 出现在其它层就不可能达成平衡。
- 非叶子节点的度一定是2。
- 在同样深度的二叉树中,满二叉树的节点个数最多,叶子数最多。
完全二叉树
对于一棵具有 n个节点的二叉树按照层序编号,如果编号为 i(1≤ i ≤ n1)的节点与同样深度的满二叉树中编号为 i的节点在二叉树中位置完全相同,则这棵二叉树称为”完全二叉树“。
满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树
完全二叉树的特点:
- 叶子节点只能出现在最下两层。
- 最下层的叶子一定集中左部连续位置。
- 倒数第二层,若有叶子节点,一定都在右部连续位置。
- 如果节点度为1,则该节点只有左孩子,即不存在右子树的情况。
- 同样节点的二叉树,完全二叉树的深度最小。
二叉树的性质
性质1:在二叉树的第 i ii 层上至多有 2^(i-1)个结点(i ≥ 1)
性质2:深度为 k kk 的二叉树至多有 2^k-1个结点(k ≥ 1)
性质3:对任何一棵二叉树 T,如果其终端结点数为 n0,度为2的节点数为 n2,则n0=n2+1
性质4:具有 n个结点的完全二叉树的深度为 ⌊log2n⌋+1 (其中⌊x⌋ 表示向下取整,即表示不大于x的最大整数)
性质5:如果对一棵有 n个结点的完全二叉树(其深度为⌊log2n⌋+1)的结点按层序编号(从第 1层到第 ⌊log2n⌋+1 层,每层从左到右),对任一结点 i(1≤i≤n)有:
- 如果 i=1,则结点 i是二叉树的根,无双亲;如果 i>1,则其双亲是结点 ⌊i/2⌋
- 如果 2i>n,则结点 i无左孩子(结点 i 为叶子结点);否则其左孩子是结点 2i。
- 如果 2i+1>n ,则结点 i 无右孩子;否则其右孩子是结点 2i+1
注意:
如果根节点从0开始存放的二叉树,则:
当一个节点为i,其父节点为(i-1)/2,左子节点为2i+1,右子节点为2i+2;
而如果根节点从1开始,则:
当一个节点为i,其父节点为i/2,左子节点为2i,右子节点为2i+1;
二叉树的遍历
中序遍历
- 若树为空,则空操作返回
- 否则:
- 中序遍历根结点的左子树
- 然后是访问根结点
- 最后中序遍历右子树。
前序
- 若二叉树为空,则空操作;
- 否则
- 访问根结点 (V);
- 前序遍历左子树 (L);
- 前序遍历右子树 ®。
后序
- 若二叉树为空,则空操作;
- 否则
- 后序遍历左子树 (L);
- 后序遍历右子树 ®;
- 访问根结点 (V)。