c#数据结构( 4.1树和二叉树)

一,树的定义

        树(Tree)是 n(n≥0)个相同类型的数据元素的有限集合。树中的数据元素叫结点(Node)。n=0 的树称为空树(Empty Tree);对于 n>0 的任意非空树 T 有:

(1)有且仅有一个特殊的结点称为树的根(Root)结点,根没有前驱结点;

(2)若n>1,则除根结点外,其余结点被分成了m(m>0)个互不相交的集合T1,T2,…,Tm,其中每一个集合Ti(1≤i≤m)本身又是一棵树。树T1,T2,…,Tm称为这棵树的子树(Subtree)。由树的定义可知,树的定义是递归的,用树来定义树。因此,树(以及二叉树)的许多算法都使用了递归。         

          下图是一棵具有 10 个结点的树,即T={A,B,C,D,E,F,G,H,I,J}。结点A是树T的根结点,根结点A没有前驱结点。除A之外的其余结点分成了三个互不相交的集合:T1={B,E,F,G},T2={C,H},T3={ D,I,J},分别形成了三棵子树,B、C和D分别成为这三棵子树的根结点,因为这三个结点分别在这三棵子树中没有前驱结点。


                                                   图5.1

          从树的定义和上图的示例可以看出,树具有下面两个特点:

(1)树的根结点没有前驱结点,除根结点之外的所有结点有且只有一个前驱结点。

(2)树中的所有结点都可以有零个或多个后继结点。实际上,第(1)个特点表示的就是树形结构的“一对多关系”中的“一”,第(2)特点表示的是“多”。由此特点可知,下图所示的都不是树。


1.1树的相关术语

1、结点(Node):表示树中的数据元素,由数据项和数据元素之间的关系组成。在图 5.1 中,共有 10 个结点。

2、结点的度(Degree of Node):结点所拥有的子树的个数,在图 5.1 中,结点 A 的度为 3。

3、树的度(Degree of Tree):树中各结点度的最大值。在图 5.1 中,树的度为3。

4、叶子结点(Leaf Node):度为 0 的结点,也叫终端结点。在图 5.1 中,结点 E、F、G、H、I、J 都是叶子结点。

5、分支结点(Branch Node):度不为 0 的结点,也叫非终端结点或内部结点。在图 5.1 中,结点 A、B、C、D 是分支结点。

6、孩子(Child):结点子树的根。在图 5.1 中,结点 B、C、D 是结点 A 的孩子。

7、双亲(Parent):结点的上层结点叫该结点的双亲。在图 5.1 中,结点 B、C、D 的双亲是结点 A。

8、祖先(Ancestor):从根到该结点所经分支上的所有结点。在图 5.1 中,结点 E 的祖先是 A 和 B。

9、子孙(Descendant):以某结点为根的子树中的任一结点。在图 5.1 中,除A 之外的所有结点都是 A 的子孙。

10、兄弟(Brother):同一双亲的孩子。在图 5.1 中,结点 B、C、D 互为兄弟。

11、结点的层次(Level of Node):从根结点到树中某结点所经路径上的分支数称为该结点的层次。根结点的层次规定为 1,其余结点的层次等于其双亲结点的层次加 1。 

12、堂兄弟(Sibling):同一层的双亲不同的结点。在图 5.1 中,G 和 H 互为堂兄弟。

13、树的深度(Depth of Tree):树中结点的最大层次数。在图 5.1 中,树的深度为 3。

14、无序树(Unordered Tree):树中任意一个结点的各孩子结点之间的次序构成无关紧要的树。通常树指无序树。

15、有序树(Ordered Tree):树中任意一个结点的各孩子结点有严格排列次序的树。二叉树是有序树,因为二叉树中每个孩子结点都确切定义为是该结点的左孩子结点还是右孩子结点。

16、森林(Forest):m(m≥0)棵树的集合。自然界中的树和森林的概念差别很大,但在数据结构中树和森林的概念差别很小。从定义可知,一棵树有根结点和m 个子树构成,若把树的根结点删除,则树变成了包含 m 棵树的森林。当然,根据定义,一棵树也可以称为森林。

1.2树的逻辑表示

     1、直观表示法它象日常生活中的树木一样。整个图就象一棵倒立的树,从根结点出发不断扩展,根结点在最上层,叶子结点在最下面,如图 5.1 所示。

    2、凹入表示法每个结点对应一个矩形,所有结点的矩形都右对齐,根结点用最长的矩形表示,同一层的结点的矩形长度相同,层次越高,矩形长度越短,图 5.1 中的树的凹入表示法如图 5.3 所示。


   

    3、广义表表示法用广义表的形式表示根结点排在最前面,用一对圆括号把它的子树结点括起来,子树结点用逗号隔开。 图 5.1 的树的广义表表示如下:(A(B(E,F,G),C(H),D(I,J)))

    4、嵌套表示法类似数学中所说的文氏图表示法,如图 5.4 所示。


二,二叉树的定义

         二叉树(Binary Tree)是 n(n≥0)个相同类型的结点的有限集合。

         n=0 的二叉树称为空二叉树(Empty Binary Tree);对于 n>0 的任意非空二叉树有:

(1)有且仅有一个特殊的结点称为二叉树的根(Root)结点,根没有前驱结点;

(2)若n>1,则除根结点外,其余结点被分成了 2 个互不相交的集合TL,TR,而TL、TR本身又是一棵二叉树,分别称为这棵二叉树的左子树(Left Subtree)和右子树(Right Subtree)。

           由树的定义可知,二叉树是另外一种树形结构,并且是有序树,它的左子树和右子树有严格的次序,若将其左、右子树颠倒,就成为另外一棵不同的二叉树。因此,图 5.5(a)和图 5.5 (b)所示是不同的二叉树。


                二叉树的形态共有 5 种:空二叉树只有根结点的二叉树右子树为空的二叉树左子树为空的二叉树和左、右子树非空的二叉树。二叉树的 5 种形态如图5.6 所示。 


          下面介绍两种特殊的二叉树。

(1)满二叉树(Full Binary Tree):如果一棵二叉树只有度为 0 的结点和度为 2的结点,并且度为 0 的结点在同一层上,则这棵二叉树为满二叉树,如图 5.7(a)所示。由定义可知,对于深度为k的满二叉树的结点个数为 2k-1。

(2)完全二叉树(Complete Binary Tree):深度为 k,有 n 个结点的二叉树当且仅当其每一个结点都与深度为 k,有 n 个结点的满二叉树中编号从1到n的结点一一对应时,称为完全二叉树,如图 5.7(b)所示。完全二叉树的特点是叶子结点只可能出现在层次最大的两层上,并且某个结点的左分支下子孙的最大层次与右分支下子孙的最大层次相等或大 1。


1.1,二叉树的性质



1.2,二叉树的储存结构

      二叉树的存储结构主要有三种:顺序存储结构、二叉链表存储结构和三叉链表存储结构

1、二叉树的顺序存储结构对于一棵完全二叉树,由性质 5 可计算得到任意结点 i 的双亲结点序号、左孩子结点序号和右孩子结点序号。所以,完全二叉树的结点可按从上到下和从左到右的顺序存储在一维数组中,其结点间的关系可由性质 5 计算得到,这就是二叉树的顺序存储结构。图 5.7(a)所示的二叉树的顺序存储结构为:


但是,对于一棵非完全二叉树,不能简单地按照从上到下和从左到右的顺序存放在一维数组中,因为数组下标之间的关系不能反映二叉树中结点之间的逻辑关系。所以,应该对一棵非完全二叉树进行改造,增加空结点(并不存在的结点)使之成为一棵完全二叉树,然后顺序存储在一维数组中。图 5.8(a)是图 5.6(e)的完全二叉树形态,图 5.8(b)是图 5.8(a)的顺序存储示意图。



2、二叉树的二叉链表存储结构

    二叉树的二叉链表存储结构是指二叉树的结点有三个域:一个数据域和两个引用域,数据域存储数据,两个引用域分别存放其左、右孩子结点的地址。当左孩子或右孩子不存在时,相应域为空,用符号 NULL 或∧表示。结点的存储结构如下所示:


    图 5.10 是图 5.8(a)所示的二叉树的二叉链表示意图。图 5.10(a)是不带头结点的二叉链表,图 5.10(b)是带头结点的二叉链表。


    由图 5.10 所示的二叉树有 4 个结点,每个结点中有两个引用,共有 8 个引用,其中 3 个引用被使用,5 个引用是空的。由性质 4 可知:由 n 个结点构成的二叉链表中,只有 n-1 个引用域被使用,还有 n+1 个引用域是空的。

3,二叉树的三叉链表存储结构

     使用二叉链表,可以非常方便地访问一个结点的子孙结点,但要访问祖先结点非常困难。可以考虑在每个结点中再增加一个引用域存放其双亲结点的地址信息,这样就可以通过该引用域非常方便地访问其祖先结点。这就是下面要介绍的三叉链表。二叉树的三叉链表存储结构是指二叉树的结点有四个域:一个数据域和三个引用域,数据域存储数据,三个引用域分别存放其左、右孩子结点和双亲结点的地址。当左、右孩子或双亲结点不存在时,相应域为空,用符号 NULL 或∧表示。结点的存储结构如下所示:


    图 5.11 是图 5.8(a)所示的二叉树的三叉链表示意图。图 5.11(a)是不带头结点的三叉链表,图 5.11(b)是带头结点的三叉链表。


猜你喜欢

转载自blog.csdn.net/qq_40138785/article/details/81040285