基本概念:
树是一种数据结构,它是由n(n≥0)个有限节点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。
树的逻辑结构:
任何一颗树,都可以分成根和n棵子树
树与非树:
子树是不相交的
除了根节点外,每个节点有且仅有一个父节点
一颗有N个节点的树有N-1条边
名词概念:
节点的度: | 一个节点含有子树的个数,如上图,A的度为3 |
叶节点火终端节点: | 度为零的节点。如上图中的J K L |
分支节点或非终端节点: | 度不为零的节点.上图中除了J K L以外的节点 |
父节点或双亲节点 | 若一个节点含有子节点,那么这个节点成为子节点的父节点。如上图,A是B C D的父节点 |
子节点或孩子节点 | 一个节点含有的子树的根节点称为该节点的子节点。如上图,B C D的父节点都为A |
兄弟节点 | 具有相同父节点的节点互为兄弟节点 如上图,B C D互为兄弟节点 |
树的度 | 一棵树中,最大的节点的度称为树的度。上图中树的度为3 |
节点的层次 | 从根开始定义,根是第一层,根的子节点为第二层…. 也有可能从0开始计数,根为第零层。 |
树的高度or深度 | 树中节点的最大层次 当节点的层次从0开始定义时,空树的深度为-1 当结点的层次从1开始定义时,空树的深度为0 |
堂兄弟节点 | 父节点在同一层上互为堂兄弟节点 |
节点的祖先 | 从根节点到当前节点所经过的所有的分支节点。 |
子孙 | 以某节点为根的子树中的任意一个节点都是该节点的子节点 |
森林 | n棵互不相交的树为森林 |
树的表示:
1.定义节点?
struct TreeNode
{
int data;
struct TreeNode* child1;
struct TreeNode* child2;
struct TreeNode* child3;
struct TreeNode* child4;
//...
};
本方法错误的地方:
如果知道树的度,但可能存在很多指针浪费
不知道树的度就无法处理
2.孩子兄弟表示法
struct TreeNode
{
int data;
struct TreeNode* child;
struct TreeNode* brother;
};
每个节点只表示其的第一个子节点,然后通过结构体中的brother指针来指向该节点的其他子节点
树的应用:
linux的系统为一棵树
windows的文件系统是森林
特殊的树:
二叉树:
二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。
满二叉树:
一个二叉树,如果每一个层的节点数都达到最大值,则这个二叉树就是满二叉树。而就是说,如果一个二叉树的层数为h,则节点总数为(利用等比公式or错位相减法来计算)。则它就是满二叉树。
层数:。
节点个数计算:
从上到下依次为:1,2,4,8,16,32 ....等比公式计算
完全二叉树:
完全二叉树是效率很高的数据结构,完全二叉树是满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个节点都与深度为K的满二叉树中编号从1到n的节点,此时称为完全二叉树,而满二叉树是一种特殊的完全二叉树(前N-1层是满的,最后一层可以不满,但从左向右必须连续)
节点个数:
假设完全二叉树的高度为h
节点个数范围:
二叉树的一些结论:
度为0的节点为,度为2的节点为, 那么
每增加一个度为2的节点,就会增加一个度为0的,初始时,度为0的节点比度为2的节点多一个.