树的学习过程中,二叉树比较重要,但是在学习二叉树之前,得先需要了解到一些数的概念。
树的定义
树是一种非线性的数据结构,它是由 n(n >= 0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像是一棵倒挂的树,也就是说,就是一个根朝上,叶朝下的数。
树的性质
树有一个特殊的结点,称为根结点,根结点没有前驱结点;
除根结点外,其余结点被分成M个互不相交的集合T1、T2、......、Tm,其中每一个集合Ti(1 <= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继;
树是递归定义:
- 任何一棵树,都可以被拆成一个根和n(n >= 0)棵子树组成。所以树一定会被归类为递归问题解决。那树的递归问题的返回条件就是,当遇到叶子的时候没有子树了,那么就开始返回。
那么什么是非线性的呢?
- 简单点来说就是非线性就是逻辑结构上不是线性的,在逻辑结构上不是一个挨着一个,逻辑结构上就是一个倒挂的树。
我们首先要清楚的是数据元素间的相互关系具体应包括3个方面:
- 数据的逻辑结构;
- 数据的存储结构;
- 数据的运算集合。
逻辑结构和物理结构:
- 逻辑结构就是我们想象出来的;
- 物理结构是在内存中实在存储结构。
而在之前我们所学习的线性表、栈、对、字符串、数组以及广义表都属于线性结构。
这里我们注意一下,数组型结构的物理结构与逻辑结构是一致的,在逻辑结构中数组存储是连续的,在物理结构中也是连续的。
但是链表就与数组不同。我们在平时画图的过程中,链表中具有箭头并且每个箭头指向下一个,依次往后,但是在实践中,可能并不是如此的。这些结构都是来自堆上面的。线性表在逻辑结构是连续的,通过每一个箭头,上一个指向下一个,但是在实际过程中并没有箭头,就是上一个存储下一个的地址。
树的相关概念
- 链表中的节点都是有一个或者固定的指针,例如指向下一个节点的指针。
- 双向链表中,就是有指向前驱指针以及指向后继指针。
- 而在树中一个节点则是会有很多的指针,指向孩子们。
结点的度
结点的度:一个节点含有的子树的个数称为该结点的度;如A节点的度为6,B节点的度为0。
叶节点或终端结点
叶节点或终端结点:度为0的节点称为叶节点;如上图P/Q/H/I/B/C...等都为叶节点。
非终端节点或分支节点
非终端节点或分支节点:度不为0的结点;如上图D/E/F/G/J都为非终端节点。
所以一个数可以看做是根、分支节点和叶节点的组合。
双亲节点或父节点
双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;如上图:A是B的父节点。
孩子节点或子节点
孩子节点或子节点:一个节点含有子树的根结点则称为该结点的子节点;如上图:B是A的孩子节点。
一个节点可能即是父节点又是子节点。
在这里,有些地方会叫做“双亲节点”。这里并不是有两个父节点,它仍然只有一个父亲,而是为了歧义译为“父母双亲”。
兄弟节点
兄弟节点:具有相同父节点的结点互称为兄弟节点;如上图:B、C是兄弟节点(亲兄弟)。
树的度
树的度:一棵树中,每个结点有个度,最大节点的度称为树的度;如上图:树的度为6。
树的层次
树的层次:从根开始定义起,根为第一层,根的子节点为第2层,以此类推;
树的高度或深度
树的高度或深度:树中节点的最大层次;如上图:层次为4;
数组的下标是从0开始的。
那么高度和深度是从0开始还是1开始?
- 树的层次,并没有细致的规定,但是建议使用从1开始。
数组下标为什么从0开始呢?
- 为了方便计算,a[ i ]等价于*( a + i )。
数组与指针的关系是什么?
- 数组名是首元素的地址。a[ i ]等价于*( a + i ) 。
那么为什么树建议从1开始而不是从0开始呢?
堂兄弟节点
堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:H、I互为兄弟节点。
节点的祖先
节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先。
子孙
子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙。
森林
森林:有m ( m > 0 ) 棵互不相交的树的集合称为森林;(在以后学习的并查集就是属于森林)。
树,简而言之就是数的概念+人类亲缘关系而进行描述的。
树与非树
树注意:
- 子树之间是不能相交的;
- 除了根节点外,每个结点有且只有一个父节点;
- 一棵N个结点的树有N-1条边。
树形结构中,子树之间是不能有交集的,否则就不是树形结构。