0.树的定义
树是n个结点的有限集,有且只有一个特定的称为根的结点,当
时,其余结点可分为m个互不相交的有限集,其中集合本身又是一棵树,并且称为树的子树。树的根结点没有前驱结点,除了根结点外的所有结点有且只有一个前驱结点,树中的所有结点可以有零个或多个后驱结点。树中的结点包含一个数据元素和若干指向其子树的分支,结点拥有的子树数目称为结点的度,度为0的结点称为叶子或终端结点,度不为0的结点称为非终端结点或分支结点,树中结点的最大层次称为树的深度,叶子结点高度为1,非叶子结点的高度等于子女结点高度加1,树的高度等于根的深度。从树中一个结点到另一个结点之间的分支数目构成结点之间的长度叫路径,路径长度是指路径上分支的数目,树的路径长度是从树的根到每一个结点的路径之和。森林是m棵互不相交的树的集合。
树的常见的表示法有嵌套集合表示法、凹入表表示法和广义表表示法。
1.二叉树
二叉树的特点是每个结点至多只有两个子树,子树有左右之分。
在二叉树的第i层上至多有
个结点,深度为k的二叉树至多有
个结点,对任何一棵非空二叉树,如果其终端结点为
,度为2的节点数为
,则
;具有n个结点的完全二叉树深度为
。一颗深度为k且有
个结点的二叉树称为满二叉树,若对满二叉树自顶向下,同层自左向右连续编号,则深度为k有n个结点的二叉树,当且仅当其每个结点都与深度为k的满二叉树中的编号从1~n的结点一一对应,则称之为完全二叉树。满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。在完全二叉树中,若某个结点没有左孩子,则必没有右孩子,则该结点一定是叶子结点。
(1)存储方式
存储方式有两种,分别是顺序存储和链式存储。
<1>顺序存储
二叉树是一种非线性结构,二叉树的顺序存储一般是用连续地址依次自上而下,自左向右进行储存。
<2>链式存储
定义两个指针域分别指向左右子树的根节点,由于查找父母结点困难,因此额外定义一个指向双亲的指针。
(2)二叉树的遍历
在给定的结点上,可以进行如下的操作:(1)访问该结点本身(2)遍历左子树(3)遍历右子树
利用递归遍历,则利用前序、中序、后序遍历进行遍历;在非递归遍历中,借助栈进行遍历。
(3)存储表示
(1)父指针表示法:一个数据data和父结点的指示器parent。(2)子女链表表示法:采用多重链表。
森林转化成树的过程如下图: