树和二叉树
一.树
树:是N(N≥0)个结点的有限集合,N=0时,称为空树,这是一种特殊情况。在任意一棵非空树中应满足:
- 有且仅有一个特定的称为根的结点。
- 当N>1时,其余结点可分为m(m>0)个互不相交的有限集合T1,T2,…,Tm,其中每一个集合本身又是一棵树,并且称为根结点的子树。
显然树的定义是递归的,是一种递归的数据结构。树作为一种逻辑结构,同时也是一种分层结构,具有以下两个特点:
- 树的根结点没有前驱结点,除根结点之外的所有结点有且仅有一个前驱结点。
- 树中所有结点可以有零个或者多个后继结点。
树适合于表示具有层次结构的数据。
树中的某个结点(除了根结点之外)最多之和上一层的一个结点(其父结点)有直接关系,根结点没有直接上层结点,因此在n个结点的树中最多只有n-1
条边。而树中每个结点与其下一层的零个或者多个结点(即其子女结点)有直接关系。
对K来说:根结点A到K的唯一路径上的任意结点,称为K的祖先结点。如结点B是K的祖先节点,K是B的子孙结点。路径上最接近K的结点E称为K的双亲结点,K是E的孩子结点。根A是树中唯一没有双亲的结点。有相同双亲的结点称为兄弟节点,如K和L有相同的双亲结点E,即K和L是兄弟结点。
树中一个结点的子结点个数称为该结点的度,树中结点最大度数称为树的度。如B的度为2,但是D的度为3,所以该树的度为3.
度大于0的结点称为分支结点(又称为非终端结点);度为0(没有子女结点)的结点称为叶子结点(又称终端结点)。在分支结点中,每个结点的分支数就是该节点的度。
结点的高度,深度和层次。
结点的层次从树根开始定义,根节点为第一层(有些教材将根节点定义为第0层),它的子结点为第2层,以此类推。
结点的深度是从根节点开始自顶向下逐层累加的。
结点的高度是从叶节点开始自底向上逐层累加的。
树的高度
(又称深度)是树中结点的最大层数。
2.有序树和无序树
树中结点的子树从左到右是有次序的,不能交换,这样的树称为有序树。有序树中,一个结点其子结点从左到右顺序出现是有关联的。反之称为无序树。在上图中,如果将子结点的位置互换,则变为一棵不同的树。
路径和路径长度:树中两个结点之间的路径是由这两个节点之间所经过的结点序列构成的,而路径长度是路径上所经过的边的个数。A和K的路径长度为3.路径为B,E。
3.森林
森林是m棵互不相交的树的集合。森林的概念和树的概念十分相近,因为只要把树的根节点删掉之后就变成了森林。反之,只要给n棵独立的树加上一个结点,并且把这n棵树作为该结点的子树,那么森林就变成了树。
4.树的基本性质
- 树中结点数等于所有节点的度数+1.
- 度为m的树中第i层上之多有mi−1个结点(i≥1)
- 高度为h的m叉树至多有mh−1m−1个结点。
- 具有n个结点的m叉树的最小高度为logm(n(m−1)+1)。
二.二叉树的概念
(1)二叉树的编号
UVA679 小球下落 Dropping Balls(二叉树的编号)
1.二叉树和度为2的有序树的区别:
度为2的树至少有3个结点,而二叉树则可以为空;
度为2的有序树的孩子结点的左右次序是相对于另一个孩子结点而言的,如果某个结点只有一个孩子结点,这个孩子结点就无需区别其左右次序,但是二叉树无论孩子数是否为2,均需要确定其左右次序,也就是说二叉树结点次数不是相对于另一个结点而言,而是确定的。
2.满二叉树
树中除了叶子节点,每个节点都有两个子节点
高度为h,由2^h-1个节点构成的二叉树称为满二叉树。
3.完全二叉树:
完全二叉树是由满二叉树而引出来的,若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数(即1~h-1层为一个满二叉树),第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
堆一般都是用完全二叉树来实现的。
4.平衡二叉树:
树的左右子树的高度差不超过1的数,空树也是平衡二叉树的一种。
平衡二叉树,又称AVL树。它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的高度之差之差的绝对值不超过1.。
5.二叉树的遍历
先(前)序遍历: 对访问到的每个结点,先访问根结点,然后是左结点,然后是右结点
中序遍历: 对访问到的每个结点,先访问左结点,然后是根结点,然后是右结点
后序遍历: 对访问到的每个结点,先访问左结点,然后是右结点,然后是根结点
先(前)序遍历:1 2 4 5 7 8 3 6
中序遍历:4 2 7 5 8 1 3 6
后序遍历:4 7 8 5 2 6 3 1
层次遍历:1 2 3 4 5 6 7 8
1.先序遍历
(1)递归写法
void PreOrder(BitTree T)
{
if(T