唠嗑一下数据结构中树的一些概念(持续更新....)

目录

1、树的定义

2、树的相关术语

3、树的性质

4、几个特殊的二叉树

5、二叉树的性质

6、二叉树的存储结构

7、由遍历序列构造二叉树

8、树、森林与二叉树的转化 

9、树和森林的遍历


1、树的定义

首先给出树的相关定义:树(tree)是包含n(n>0)个结点的有穷集,其中:

1)每个元素称为结点(node);

2)有一个特定的结点被称为根结点或树根(root);

3)除根结点之外的其余数据元素被分为m(m≥0)个互不相交的集合T1,T2,……Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树。

树也可以这样定义:树是由根结点和若干颗子树构成的。树是由一个集合以及在该集合上定义的一种关系构成的。

集合中的元素称为树的结点,所定义的关系称为父子关系。

父子关系在树的结点之间建立了一个层次结构。

在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或称为树根。

2、树的相关术语

节点的度:一个节点含有的子树的个数称为该节点的度;

叶节点或终端节点:度为0的节点称为叶节点;

非终端节点或分支节点:度不为0的节点;

双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
(对于节点来说父母同体,所以只能称为双亲节点)
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;

兄弟节点:具有相同父节点的节点互称为兄弟节点;

树的度:一棵树中,最大的节点的度称为树的度;

节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;

树的高度或深度:树中节点的最大层次;

结点的深度、高度和层次:
结点的层次从树根开始定义,根结点为第1层,它的子结点为第2层,以此类推。双亲在同一层的结点互为堂兄弟。
结点的深度是从根结点开始自顶向下逐层累加的。
结点的高度是从叶结点开始自底向上逐层累加的。
树的高度(或深度)是树中结点的最大层数。

堂兄弟节点:双亲在同一层的节点互为堂兄弟;

节点的祖先:从根到该节点所经分支上的所有节点;

子孙:以某节点为根的子树中任一节点都称为该节点的子孙。

路径和路径长度:树中两个结点之间的路径是由这两个结点之间所经过的结点序列构成的,而路径长度是路径上所经过的边的个数。
注意:由于树中的分支是有向的,即从双亲指向孩子,所以树中的路径是从上向下的,同一双亲的两个孩子之间不存在路径。

森林:由m(m>=0)棵互不相交的树的集合称为森林;森林的概念与树的概念十分相近,因为只要把树的根结点删去就成了森林。反之,只要给m棵独立的树加上一个结点,并把这m棵树作为该结点的子树,则森林就变成了树。

3、树的性质

最基本的性质:

(1)树中的结点数等于所有结点的度数加1

(2)度为m的树中第i层上至多有m^(i-1)个结点(i>=1)

(3)高度为h的m叉树至多有(m^h-1)/(m-1)个结点

(4)具有n个结点的m叉树的最小高度为 以m为底的[log(n(m-1)+1)]

4、几个特殊的二叉树

(1)斜树
所有的结点都只有左子树的二叉树叫左斜树。所有结点都是只有右子树的二叉树叫右斜树。这两者统称为斜树。

(2)满二叉树
一棵高度为h,且含有2h-1个结点的二叉树称为满二叉树,即树中的每层都含有最多的结点。满二叉树的叶子结点都集中在二叉树的最下一层,并且除叶子结点之外的每个结点度数均为2。可以对满二叉树按层序编号:约定编号从根结点(根结点编号为1)起,自上而下,自左向右。这样,每个结点对应一个编号,对于编号为i的结点,若有双亲,则其双亲为i/2,若有左孩子,则左孩子为2i;若有右孩子,则右孩子为2i+1

(3)完全二叉树
高度为h、有n个结点的二叉树,当且仅当其每个结点都与高度为h的满二叉树中编号为1~n的结点一一对应时,称为完全二叉树。其特点如下:

a.若i<=n/2,则结点i为分支结点,否则为叶子结点。
b.叶子结点只可能在层次最大的两层上出现。对于最大层次中的叶子结点,都依次排列在该层最左边的位置上。
c.若有度为1的结点,则只可能有一个,且该结点只有左孩子而无右孩子(重要特征)。
d.按层序编号后,一旦出现某结点(编号为i)为叶子结点或只有左孩子,则编号大于i的结点均为叶子结点。
e.若n为奇数,则每个分支结点都有左孩子和右孩子;若n为偶数,则编号最大的分支结点(编号为n/2只有左孩子,没有右孩子,其余分支结点左、右孩子都有。

(4)二叉排序树

左子树上所有结点的关键字均小于根结点的关键字;右子树上的所有结点的关键字均大于根结点的关键字;左子树和右子树又各是一棵二叉排序树。

(5)平衡二叉树

树上任一结点的左子树和右子树的深度之差不超过1。

                

5、二叉树的性质

1.任意一棵树,若结点数量为n,则边的数量为n−1

2.非空二叉树上的叶子结点数等于度为2的结点数加1,即n0=n2+1 

   由该性质可推导出哈夫曼树中叶子结点数量与总数量的关系:

   叶子结点总数为m的哈夫曼树的总结点数为:2*m-1

3.非空二叉树上第k层上至多有2^(k-1)个结点(k>=1)

4.高度为h的二叉树至多有2^h-1个结点(h>=1)

5.对完全二叉树按从上到下、从左到右的顺序依次编号1 , 2,... , n,则有以下关系:

        (1)i>1时,结点i的双亲的编号为i/2,即当i为偶数时, 它是双亲的左孩子;当i为奇数时,它是双亲的右孩子。

        (2)当2*i <= n时,结点i的左孩子编号为2*i,否则无左孩子。

        (3)当2*i+1 ≤ n时,结点i的右孩子编号为2*i+1,否则无右孩子。

        (4)结点i所在层次(深度)为{ log(2) i } + 1 。(log以2为底)

6.具有n个(n>0)结点的完全二叉树的高度为{ log(2) n} + 1

6、二叉树的存储结构

1.顺序存储结构

依据二叉树的性质,完全二叉树和满二叉树采用顺序存储比较合适,树中结点的序号可以唯一地反映结点之间的逻辑关系,这样既能最大可能地节省存储空间,又能利用数组元素的下标值确定结点在二叉树中的位置,以及结点之间的关系。但对于一般的二叉树,为了让数组下标能反映二叉树中结点之间的逻辑关系,只能添加一些并不存在的空结点,让其每个结点与完全二叉树上的结点相对照,再存储到一维数组的相应分量中。然而,在最坏情况下,一个高度为h且只有h个结点的单支树却需要占据近2*h−1个存储单元。

2.链式存储结构

既然顺序存储适用性不强,我们就要考虑链式存储结构。二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域是比较自然的想法,我们称这样的链表叫做二叉链表。

在这里插入图片描述

 注意:在含有n个结点的二叉链表中,含有n + 1个空链域。

7、由遍历序列构造二叉树

(1)由二叉树的先序序列和中序序列可以唯一地确定一棵二叉树。
在先序遍历序列中,第一个结点一定是二叉树的根结点;而在中序遍历中,根结点必然将中序序列分割成两个子序列,前一个子序列是根结点的左子树的中序序列,后一个子序列是根结点的右子树的中序序列。根据这两个子序列,在先序序列中找到对应的左子序列和右子序列。在先序序列中,左子序列的第一个结点是左子树的根结点,右子序列的第一个结点是右子树的根结点。
如此递归地进行下去,便能唯一地确定这棵二叉树


(2)由二叉树的后序序列和中序序列也可以唯一地确定一棵二叉树。
因为后序序列的最后一个结点就如同先序序列的第一个结点,可以将中序序列分割成两个子序列,然后采用类似的方法递归地进行划分,进而得到一棵二叉树。


(3)由二叉树的层序序列和中序序列也可以唯一地确定一棵二叉树。
要注意的是,若只知道二叉树的先序序列和后序序列,则无法唯一确定一棵二叉树。
例如,求先序序列(ABCDEFGH)和中序序列( BCAEDGHFI)所确定的二叉树
首先,由先序序列可知A为二叉树的根结点。中序序列中A之前的BC为左子树的中序序列,EDGHFI为右子树的中序序列。然后由先序序列可知B是左子树的根结点,D是右子树的根结点。以此类推,就能将剩下的结点继续分解下去,最后得到的二叉树如图(c)所示。

8、树、森林与二叉树的转化 

树的孩子兄弟法可以将一棵树用二叉链表进行存储,所以借助二叉链表,树和二叉树可以相互进行转换。从物理结构来看,它们的二叉链表也是相同的,只是解释不太一样而已。 因此,只要我们设定一定的规则,用二叉树来表示树,甚至表示森林都是可以的,森林与二叉树也可以互相进行转换。

1.树转换为二叉树

树转换为二义树的规则:每个结点左指针指向它的第一个孩子,右指针指向它在树中的相邻右兄弟,这个规则又称“左孩子右兄弟”。由于根结点没有兄弟,所以对应的二叉树没有右子树。树转换成二叉树的画法:

(1)在兄弟结点之间加一连线;
(2)对每个结点,只保留它与第一个孩子的连线,而与其他孩子的连线全部抹掉;
(3)以树根为轴心,顺时针旋转45°。

2.森林转化为二叉树

森林是由若干棵树组成的,所以完全可以理解为,森林中的每一棵树都是兄弟,可以按照兄弟的处理办法来操作。
森林转换成二叉树的画法:

将森林中的每棵树转换成相应的二叉树;
每棵树的根也可视为兄弟关系,在每棵树的根之间加一根连线;
以第一棵树的根为轴心顺时针旋转45°。

注意:二叉树转换为树或者二叉树转换为森林不过是上面步骤的逆过程。

9、树和森林的遍历

1、树的遍历
树的遍历是指用某种方式访问树中的每个结点,且仅访问一次。主要有两种方式:

a.先根遍历。若树非空,先访问根结点,再依次遍历根结点的每棵子树,遍历子树时仍遵循先根后子树的规则。其遍历序列与这棵树相应二叉树的先序序列相同。
b.后根遍历。若树非空,先依次遍历根结点的每棵子树,再访问根结点,遍历子树时仍遵循先子树后根的规则。其遍历序列与这棵树相应二叉树的中序序列相同。
下图的树的先根遍历序列为ABEFCDG,后根遍历序列为EFBCGDA。

在这里插入图片描述

另外,树也有层次遍历,与二叉树的层次遍历思想基本相同,即按层序依次访问各结点。

2、森林的遍历
按照森林和树相互递归的定义,可得到森林的两种遍历方法。

a.先序遍历森林。若森林为非空,则按如下规则进行遍历:
●访问森林中第一棵树的根结点。
●先序遍历第一棵树中根结点的子树森林。
●先序遍历除去第一棵树之后剩余的树构成的森林。
b.后序遍历森林。森林为非空时,按如下规则进行遍历:
●后序遍历森林中第一棵树的根结点的子树森林。
●访问第一棵树的根结点。
●后序遍历除去第一棵树之后剩余的树构成的森林。
图5.17的森林的先序遍历序列为ABCDEFGHI,后序遍历序列为BCDAFEHIG。

在这里插入图片描述

当森林转换成二叉树时,其第一棵树的子树森林转换成左子树,剩余树的森林转换成右子树,可知森林的先序和后序遍历即为其对应二叉树的先序和中序遍历。

我是花花,祝自己也祝您变强了~ 

Guess you like

Origin blog.csdn.net/m0_52711790/article/details/121002933