一、树的定义
由一个或多个(n≥0)结点组成的有限集合T,有且仅有一个结点称为根(root),当n>1时,其余的结点分为m(m≥0)个互不相交的有限集合T^1, T^2,....,T^m。每个集合本身又是一颗树,被称为这个根的子树。
注1:过去许多书籍中都定义树为n>1,曾经有“空树不是树”的说法,但现在树的定义已修改。
注2:树的定义具有递归性,即树中有树
二、树的术语
根————即根结点(没有前驱)
叶子———即终端结点(没有后继)
森林———指m棵不相交的树的集合(例如删除A后的子树个数)
有序树——结点各子树从左至右有序排列,不能互换(左为第一)
无序树——结点各子树可互换位置
双亲———即上层的哪个结点(直接前驱)Parent
孩子———即下层结点的子树(直接后继)Child
兄弟———同一双亲下的同层结点(孩子之间互称兄弟)Sibling
堂兄弟——即双亲位于同一层的结点(但并非同一双亲)Cousin
祖先———即从根到该结点所经分支的所有结点
子孙———即该结点下层树中的任一结点
结点———即树的数据元素
结点的度—结点挂接的子树数(有几个直接后继就有几度,或称“次数”)
结点的层次——从根到该结点的层数(根结点算第一层)
终端结点—即度为0的结点,即叶子
分支结点—除树根以外的结点(也称为内部结点)
树的度——所有结点度中的最大值(Max{各结点的度})
树的深度—指所有结点中最大的层数(Max{各结点的层次})或高度
3、树的表示法(百度查资料)
1、图形表示法
2、嵌套集合表示法
3、广义表表示法
4、目录表示法
5、左孩子-右孩子表示法(二叉树)
4、树的逻辑结构
树的特点是1对多(1:n),有多个直接后继(如家谱树、目录树等),但只有一个根结点,且子树之间互不相交。
5、树的存储结构
树虽是非线性结构,但仍然有顺序存储、链式存储等方式。
讨论1:树的顺序存储方案应该怎样制定?
可规定为:从上至下、从左至右将树的结点依次存入内存。
重大缺陷:复原困难
讨论2:树的链式存储方案应该怎样知道?
可用多重链表:一个直接前驱、n个直接后继指针。
细节问题:树中结点 的结构类型样式该如何设计?即应该设计成“等长”还是“不等长”?
缺点:等长结构太浪费(每个结点的度不一定相同);
不等长结构太复制(要定义多种结构类型)
(使用链表存储后继结点,或改为二叉树)
6、树的运算
要明确:
1、普通树(即多叉树)若不转化为二叉树,则运算很难实现。
2、二叉树的运算仍然是插入、删除、修改、查找、排序等,但这些操作都必须建立在对树结点能够“遍历”的基础上。
(遍历——指每个结点都被访问且仅访问一次,不遗漏不重复)
7、二叉树
二叉树的结构最简单,规律性最强;
可以证明,所有的树都能转化为唯一对应的二叉树,不失一般性。
8、二叉树的定义
定义:n(n≥0)个结点的有限集合,由一个根节点以及两颗互不相交的、分别称为左子树和右子树的二叉树组成。
逻辑结构:一对二(1:2)
基本特征:
1、每个结点最多只有两颗子树(不存在度>2的结点)。
2、左子树和右子树次序不能颠倒(有序树)。
9、二叉树的性质
1、在二叉树的第i层上至多有2^(i-1)个结点(i>0)。
2、深度为k的二叉树至多有(2^k)-1个结点(k>0)。
3、满二叉树:一颗深度为k且有(2^k)-1个结点的二叉树。(特点:,每层都“充满”了结点)
4、完全二叉树:深度为k的,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应。(特点:只有最后一层叶子不满,且全部集中在左边),这其实是顺序二叉树的含义。
5、满二叉树与完全二叉树在顺序存储方式下可以复原。
6、对完全二叉树,若从上至下,从左至右编号,则编号为i的结点,其左子树编号必为2i,其右子树编号必为2i+1,其双亲的编号必为i/2(i=1时为根,除外)。
对于第k层中的编号为i的元素,在第k层中前面有x=i-2^(k-1)个元素,在第k层中后面有y=2^(k-1)-1-x个元素,则其左孩子编号为:
i+y+2x+i=i+2^(l-1)-1-x=2x+1=i+2^(k-1)+x=i+2^(k-1)+i-2^(k-1)-2i
则其右孩子编号为:
i+y+2x+2=2i+1
对于左右孩子,其双亲结点编号必然为i/2。