C#数据结构—树和二叉树

 线性结构中的数据元素是一对一的关系,树形结构是一对多的非线性结构,非常类似于自然界中的树,数据元素之间既有分支关系,又有层次关系。树形结构在现实世界中广泛存在,如家族的家谱、一个单位的行政机构组织等都可以用树形结构来形象地表示。树形结构在计算机领域中也有着非常广泛的应用,如 Windows 操作系统中对磁盘文件的管理、编译程序中对源程序的语法结构的表示等都采用树形结构。在数据库系统中,树形结构也是数据的重要组织形式之一。树形结构有树和二叉树两种,树的操作实现比较复杂,但树可以转换为二叉树进行处理,所以,我们主要讨论二叉树。

一:树

1.1树的定义

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

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

  (2)若n>1,则除根结点外,其余结点被分成了m(m>0)个互不相交的集合T 1 ,T 2 ,…,T m ,其中每一个集合T i (1≤i≤m)本身又是一棵树。树T 1 ,T 2 ,…,T m

称为这棵树的子树(Subtree)。

  由树的定义可知,树的定义是递归的,用树来定义树。因此,树(以及二叉树)的许多算法都使用了递归。

  树的形式定义为:树(Tree)简记为 T,是一个二元组,
          T = (D, R)
  其中:D 是结点的有限集合;
  R 是结点之间关系的有限集合。

                          图 1.1  

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

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

  (2)树中的所有结点都可以有零个或多个后继结点。

  实际上,第(1)个特点表示的就是树形结构的“一对多关系”中的“一”,第(2)特点表示的是“多”。

  由此特点可知,下图 所示的都不是树。

1.2树的相关术语

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1.3树的逻辑表示

树的逻辑表示方法很多,下面是常见的表示方法。
1、直观表示法

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

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

3、广义表表示法

用广义表的形式表示根结点排在最前面,用一对圆括号把它的子树结点括起来,子树结点用逗号隔开。图 1.1 的树的广义表表示如下:

          (A(B(E,F,G),C(H),D(I,J)))

4、嵌套表示法

类似数学中所说的文氏图表示法,如下图 所示。

二:二叉树

2.1:二叉树的定义

  二叉树(Binary Tree)是 n(n≥0)个相同类型的结点的有限集合。n=0 的二叉树称为空二叉树(Empty Binary Tree);对于 n>0 的任意非空二叉树有:

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

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

  二叉树的形式定义为:二叉树(Binary Tree)简记为 BT,是一个二元组,

              BT = (D, R)

  其中:D 是结点的有限集合;
     R 是结点之间关系的有限集合。

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

  

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

  两种特殊的二叉树:

  (1)满二叉树( Full Binary Tree ):如果一棵二叉树只有度为 0 的结点和度为 2的结点,并且度为 0 的结点在同一层上,则这棵二叉树为满二叉树,如图 (a)所示。

  由定义可知,对于深度为k的满二叉树的结点个数为 2^k -1。

  (2)完全二叉树:对一棵具有n个结点的二叉树按层序编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同,则这颗二叉树称为完全二叉树

    这是一种有些难以理解的特殊二叉树,首先从字面上要区分,“完全”和“满”的差异,满二叉树一定是一棵完全二叉树,但完全二叉树不一定是满的。

2.2:二叉树的特性

  性质 1 :一棵非空二叉树的第i层上最多有 2^(i-1) 个结点(i≥1)。(具体证明见书)

  性质 2: 若规定空树的深度为 0,则深度为k的二叉树最多有 2^k -1 个结点(满二叉树)(k≥0)。(具体证明见书)

  性质 3 :具有n个结点的完全二叉树的深度k为log 2 n+1。(具体证明见书)

  性质 4: 对于一棵非空二叉树,如果度为 0 的结点数目为n 0 ,度为 2 的结点数目为n 2 ,则有n 0 = n 2 +1。

  性质 5 对于具有 n 个结点的完全二叉树,如果按照从上到下和从左到右的顺序对所有结点从 1 开始编号,则对于序号为 i 的结点,有:

  (1)如果 i>1,则序号为 i 的结点的双亲结点的序号为 i/2(“/”表示整除);如果 i=1,则该结点是根结点,无双亲结点。

  (2)如果 2i≤n,则该结点的左孩子结点的序号为 2i;若 2i>n,则该结点无左孩子。  

  (3)如果 2i+1≤n,则该结点的右孩子结点的序号为 2i+1;若 2i+1>n,则该结点无右孩子

2.3:二叉树的存储结构

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

  

  

原文地址:https://www.cnblogs.com/SimplePoint/p/9221018.html

时间: 2024-10-10 09:33:54

C#数据结构—树和二叉树的相关文章

数据结构---树、二叉树、森林

1.基本术语: 度:有两种度"结点的度"与"树的度".结点的度指的是一个结点子树的个数:树的度是指树中结点度的最大值. 叶子结点:指的是没有子树的结点. 层:树是有层次的,一般根结点为第0层.规定根结点到某结点的路径长度为该结点的层数. 深度:树中结点的最大层数 兄弟:同一双亲的结点,互为兄弟 堂兄弟:双亲在同一层次的结点,互为堂兄弟 祖先:从根结点到该结点的路径上的所有结点都是该结点的祖先. 子孙:以某一结点为根的子树上的所有结点都是该结点的子孙 森林:n棵互不相

数据结构--树,二叉树

树和二叉树用来表示数据之间一对多的关系,而线性表,栈,队列都是线性的数据结构,用来表示一对一的关系. 树只有一个根节点,根也有子节点,子节点又对应多个或者一个子节点. 根节点没有父节点. 同一个节点有可能既是父节点,又是子节点. 普通节点含有子节点,叶子界面没有子节点. 节点:树的基本单位. 节点的度:节点子树的个数. 树的度:所有节点的度的最大值. 叶子节点,无子节点的节点,即度为0的节点. 分支节点,有子节点的节点为分支节点. 节点层次,根节点1,以此类推. 输的深度:节点最大层次. 有序树

浅谈数据结构-树和二叉树之间关系

树都可用二叉链表作为存储结构,对比各自的结点结构可以看出,以二叉链表作为媒介可以导出树和二叉树之间的一个对应关系. ◆ 从物理结构来看,树和二叉树的二叉链表是相同的,只是对指针的逻辑解释不同而已. ◆ 从树的二叉链表表示的定义可知,任何一棵和树对应的二叉树,其右子树一定为空. 1 树转换成二叉树 对于一般的树,可以方便地转换成一棵唯一的二叉树与之对应.将树转换成二叉树在"孩子兄弟表示法"中已给出,其详细步骤是: ⑴ 加虚线.在所有兄弟结点之间加线. ⑵ 去连线.只保留大孩子(除最左的第

数据结构 -树和二叉树

树的主要内容 树型结构:非线性结构,以分支关系定义的层次结构. 主要内容: 树和二叉树的概念.性质 二叉树的存储 二叉树的遍历 线索二叉树 树与二叉树的转化 Huffman树(最优树) 树的定义 树(Tree)是n(n≧0)个结点的有限集合T,若n=0时称为空树,否则: ⑴ 有且只有一个特殊的称为树的根(Root)结点: ⑵ 若n>1时,其余的结点被分为m(m>0)个互不相交的子集 T1, T2, T3-Tm,其中每个子集本身又是一棵树,称其为根的子树(Subtree). 这是树的递归定义,即

数据结构-树与二叉树

一.树的定义与性质 <1>定义 结点(node):树枝分叉处.树叶.树根 根结点(root):树根 叶子结点(leaf):叶子结点 边(edge):茎干和树枝 子结点(child) 子树(subtree) <2>性质 树可以没有结点,把这种情况下称为空树(empty tree) 树的层次(layer),从根结点开始算起来,即根结点为第一层 把结点的子树棵树称为结点的度(degree),而树的中结点的最大的度称为树的度(也称为树的宽度) 对于有n个结点的树的边一定是n-1 叶子结点被

数据结构—树(二叉树)

#define _CRT_SECURE_NO_WARNINGS 1 //树:非线性的数据结构,由有限个节点组成一个具有层次关系的集合.像是一颗倒挂的树,所以叫树. //树的相关概念: //1.节点的度:一个节点含有的子树的个数成为节点的度 //2.叶节点(终端节点):度为0的节点称为终端节点,(子节点为空的节点) //3.非终端节点(分支节点):度不为0的节点,即(子节点不为空的节点) //4.双亲节点(父节点):若一个节点含有子节点,称该节点为子节点的父节点 //5.孩子节点(子节点):一个节

python数据结构树和二叉树简介

一.树的定义 树形结构是一类重要的非线性结构.树形结构是结点之间有分支,并具有层次关系的结构.它非常类似于自然界中的树.树的递归定义:树(Tree)是n(n≥0)个结点的有限集T,T为空时称为空树,否则它满足如下两个条件:(1)有且仅有一个特定的称为根(Root)的结点:(2)其余的结点可分为m(m≥0)个互不相交的子集Tl,T2,…,Tm,其中每个子集本身又是一棵树,并称其为根的子树(Subree). 二.二叉树的定义 二叉树是由n(n≥0)个结点组成的有限集合.每个结点最多有两个子树的有序树

数据结构----树、二叉树----c++ &amp;&amp; python

树结构,尤其是二叉树结构是算法中常遇见的,这里根据学习过程做一个总结. 二叉树所涉及到的知识点有:满二叉树与完全二叉树.节点数目的关系.节点数与二叉树高度的关系.层次遍历.深度优先遍历.广度优先遍历等等. 这里对二叉树的基本结构实现c++版本以及python版本的代码,并且实现二叉树的前中后序遍历过程以及前中.中后序列创建唯一二叉树的过程. 1.C++版本实现 基本结构: http://www.cnblogs.com/elleniou/archive/2012/05/03/2480042.htm

数据结构学习笔记(树、二叉树)

树(一对多的数据结构) 树(Tree)是n(n>=0)个结点的有限集.n=0时称为空树.在任意一颗非空树种: (1)有且仅有一个特定的称为根(Root)的结点: (2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1.T2........Tn,其中每一个集合本身又是一棵树,并且称为根的子树. 对于树的定义还需要强调两点:1.n>0时根结点是唯一的,不可能存在多个根结点,数据结构中的树只能有一个根结点.2.m>0时,子树的个数没有限制,但它们一定是互不相交的. 结点