1:什么是树:
是n(n>=0)个结点的有限集。n=0的时候称为空树
在任意一棵非空树种:
(1)有且仅有一个特定的称为根(Root)的结点
(2)当n>1时,其余节点可分为m(m>0)个互不相交的有限集,T1 T2…..其中每个集合本身又是一棵树,称为根的子树
2:结点的度:
结点拥有的子树称为结点的度
结点的层次(Level)从根开始定义起,根为第一层,根的的孩子为第二层,若某个结点在第I层,则其子树的根就在第I+1层。其中树的结点的最大层次称为树的深度(Depth)或高度。
如下图深度为4
树的一些基本术语:
1:树的结点:由一个数据元素和若干个指向其子树的分支组成。
2:结点的度:结点所拥有的子树的个数(即分支数)称为该结点的度。
3:叶子结点:度为0的结点称为叶子结点,或者称为终端结点。
4:分支结点:度不为0的结点称为分支结点,或者称为非终端结点。一棵树的结点由叶子结点和分支结点组成。
5:孩子、双亲、兄弟:树中一个结点的子树的根结点称为这个结点的孩子;这个结点称为它孩子结点的双亲;具有同一个双亲的孩子结点互称为兄弟。
6:路径、路径长度:如果一棵树的一串结点n1,n2,…,nk有如下关系:结点ni是ni+1的父结点(i为1~k,不等于k的值),就把n1,n2,…,nk称为一条由n1至nk的路径。路径长度是指路径上经过的边的数量,所以这条路径的长度是k-1。
7:祖先、子孙:在树中,如果有一条路径从结点M到结点N,那么M就称为N的祖先,而N称为M的子孙。
8:结点的层数:规定树的根结点的层数为1,其余结点的层数等于它双亲结点的层数加1。
9:树的深度(高度):树中所有结点中的最大层数称为树的深度。
10:树的度:树中各结点中度的最大值称为该树的度。
11:有序树、无序树:如果一棵树中结点的各子树从左到右都是有次序的,不能交换的,称这棵树为有序树;反之为无序树。
12:森林:m(m>=0)棵互不相交的树的集合。
13:同构:对于两棵树,若通过对各结点适当重命名,就可以使这两棵树完全相等(结点对应相等,结点关系也相等),称这两棵树同构。
14:层序编号:将书中结点按照从上层到下层、同层从左到右的次序依次给它们编号1开始的自然数。
树的三种表示方式
双亲表示法
缺点:找父(爹)容易找子节点(儿子)麻烦
孩子表示法:
方案一:
缺点:
找子节点(儿子)容易,找(父结点)爹难;
数组大小不好确定,创建多了浪费空间,少了又存不下
方案二: 比上面多了一个数据域,根据它的大小来动态分配指针域,虽然解决了空间问题‘
但是还是没有办法解决,找父节点困难问题。
最终方案:(散列链表)
把每个结点的孩子结点排列起来,以单链表作为存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空,然后n个头指针又组成一个线性表,采用顺序存储结构,存放在一个一维数组中
找父节点(爹)即只要找到对应的链表的头结点就可以,
孩子兄弟表示法:
任意一棵树,它的结点的第一个孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,我们设置两个指针,分别指向该结点的第一个孩子和此结点的右兄弟
找儿子比容易,找爹比较麻烦,需要遍历