树
(tree)是n(n>=0)个结点的有限集,它
1)或者是一棵空树(n=0),空树中不包含任何结点。
2)或者是一棵非空树(n>0),此时有且仅有一个特定的称为根(root)的结点;
图中(a)是一棵空树、(b)是只有一个根节点的树、(c)是一棵有10个结点的树,其中A是根,其余结点分成3个不相交的集合,每个集合都构成一棵树,且都是根A的子树。
生活案例:
族谱
公司上下级关系
文件夹
结点的度与树的度
结点拥有的子树的数目称为结点的度(Degree)
度为0的结点称为叶子(leaf)或终端结点。
度不为的0的结点称为非终端结点或分支结点。除根之外的分支结点也称为内部结点。
树内各结点的度的最大值称为树的度
度:通俗的来讲度就是分的叉,上图A结点分了三个叉,所以度为3,k结点没有分叉,所以度为0;树的度就是树内部的结点的度最大的值就是树的度,就里那个结点的度是最大的,那个就是树的度。
叶子 :如果一个结点的度为0,这个结点的没有分叉,相当于生活在最低层,在文件里面它是文件,不是文件夹。我们把这个结点叫叶子,也叫终端结点。
上图中绿色的都是叶子,也叫终端结点,蓝色的叫终端结点,A结点叫根结点。
结点的层次和树的深度
结点的层次从根开始定义,层次数为1的结点是根结点,其子树的根的层次数为2.
荮中结点的最大层次数称为树的深度或高度。
有序树、m叉树、森林
图中的都有子树、叶子的个数都一样,就是方向不一样,一个是左子树,一个右子树,如果说这个两棵树是同一棵树,不区分左右就是无序的,如果说这两棵树不一样,区分左右就说明是有序的。若不特别指明,一般讨论的树都是有序树
树中所有结点最大度数为m的有序树称为M叉树。
上图中最大的就两个叉,所以就是二叉数;
森林是m(m>=0)棵互不相交的树的集合。对树中每个结点而言,其子树的集合即为森林。
注意树可以空,森林也可以空。
二叉树
每个结点的度均不超过2的有序树,称为二叉树(binary tree)
与树的递归定义类似,二叉树的递归定义如下:
二叉树或者是一棵空树,或者是一棵由一个根结点两棵互不相交的分别称为根的左子树和右子树的子树所组成的非空树。
由以上定义可以看出,
二叉树中每个结点的孩子数只能是0、1、或2个,并且每个孩子都有左右之分。
以左边孩子为根的子树称为左子树,以右孩子为根的子树称为右子树。
满二叉树:
左边 叶子节点:8 度是2的结点:7 右边 叶子节点:6 度是2的结点:5
对于任何一棵二叉楼树 叶子节点=度是2的结点+1
二叉数性质
二叉树的存储结构
顺序存储结构方式对满二叉树和完全二叉树是合适的
比如我求7的父亲的是谁,7的索引除2得到的整数是3,索引3的对应是3,所以7的父亲是3。
求4的儿子,4的索引乘2,8和9;但顺序存储结构用不多,因为大多数据不是完全二叉树
关系
但是对于一般的二叉树而言,必须用“虚结点”将一棵二叉树补成一棵完全二叉树来存储,否则无法确定结点之间的前驱后续关系,但是这样一来就会造成空间的浪费。
链式存储结构
设计不同的结点结构可构成不同的链式存储结构。
在二叉树中每个结点都有两个孩子,则可以设计每个结点至少包括3个域:数据域、左孩子、右孩子、。
数据域存放数据元素,左孩子域存放指向左孩子结点的指针,右孩子域存放指向右孩子的结点指针。如图a所示。
利用此结点结构得到的二叉树存储结构称为二叉链表
为了方便找到父结点,可以在上述结点结构中增加一个指针域,指向结点的父结点。如图b所示。采用些此结点结构得到的二叉树存储结构称为三叉链表。
三叉链表加了一个找父新的指针
再次说明:二叉树是树里面研究最多的树,并且二叉树是采用链式存储结构。