一,树的概念及结构
1. 树是一种非线性的数据结构,是由许多节点组成的一个具有层次关系的集合。任何一棵树都是由 [根 + N颗子树(N>=0)] 但把它称为树是因为它的像一颗倒挂的树,根在上,枝叶朝下
2. 树的一些基本概念(根据树的结构与人类的亲缘关系命名)
节点的度:一个节点含有的子树的个数称为该节点的度; 例如:节点1的度是2
叶节点或终端节点:度为0的节点称为叶节点; 没有子节点的节点
非终端节点或分支节点:度不为0的节点;
双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;
孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;
兄弟节点:具有相同父节点的节点互称为兄弟节点; 例如; 8,9节点是兄弟节点,而9,10不是;
树的度:一棵树中,最大的节点的度称为树的度(不论层数);
节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推(也可以从第0层开始,但这种命名不常用);
树的高度或深度:树中节点的最大层次;
堂兄弟节点:双亲在同一层的节点互为掌兄弟;
节点的祖先:从根到该节点所经分支上的所有节点;
子孙:以某节点为根的子树中任一节点都称为该节点的子孙。
森林:由m(m>0)棵互不相交的树的集合称为森林(多棵树);
3. 一些特殊的树
关于树的层数从0开始还是从1开始:
数组:
数组名是首元素地址, a[ i ] == *(a + i), 所以数组首元素的位置从0开始
树:
当该树为空树时(即只有一个空节点)若定义第一层为1时,则空节点为0;而若定义第一层为0时,那么空节点就是-1层,所以实际应用上更常用把第一层定义为1的情况。
4. 树与非树
1. 子树是不相交的;
2. 除了根节点外, 每个节点有且仅有一个父节点;
3. 一颗N个节点的树有N-1条边。
5. 如何表达,定义树(C语言中)
1. 树的度已知
2. 树的度未知,在结构体当中放一个顺序表存储节点
3. 左孩子,右兄弟表示法
无论一个父节点有多少个孩子,child指针只指向左边开始的第一个孩子
下图黑色是child指针, 红色的是brother指针
2. 二叉树的概念及结构
1.概念
二叉树是一种树形数据结构,每个节点最多只有两个子树,这两个子树分别被称为左子树与右子树。二叉树的节点可以没有子树,也可以只有左子树或右子树,还可以是空树。
满二叉树(是一种特殊的完全二叉树)
每个节点都有两个子节点
一个只有资深程序员才懂的图 (T A T)
完全二叉树
假设高度为h,前h - 1层都是满的,最后一层不满,且最后一层从左到右必须连续
下图就不是一个完全二叉树
下图才是一个完全二叉树
2. 二叉树的存储
a. 完全二叉树的存储(数组结构)
用下标表示父子关系
假设父亲在数组中的下标是 i,那么
左孩子在数组中的下标是2 * i + 1,
右孩子在数组中的下标是2 * i - 1
假设孩子在数组中的下标是 j
父亲在数组中的下标:(j - 1)/ 2 , 不用考虑两个孩子下标的不同。
完全二叉树也可以用数组存储,但不适合,因为有很多的空间浪费
b. 非完全二叉树的存储(链式结构)
空的地方传空指针