一、树
1.树的定义和相关概念
树是一种非线性的数据结构,它是由n个有限节点组成一个具有层次关系的集合。它是根朝上,叶朝下的。
根节点:根节点就是起始点(root),没有前驱节点
除根节点以外,每个节点被分成一棵结构与树类似的子树,每棵子树的根节点有且只有一个前驱,可以有0或多个后继。
树具有的一些性质(区别树与非树)
1.子树是不相交的。
2.除根节点以外,每个节点有且只有一个父节点。
3.一颗N个节点的树有N-1条边,即通过N-1条边将N个节点相连,不出现某个节点连多次形成环。
以一个简单的树为例:
相关概念:
节点的度:一个节点含有的子树个数,图例中的根节点1的度为2
叶节点(叶子节点):度为0的节点(没有子树的节点),图例中4 8 9 7
父节点与子节点:若一个节点含有子节点,那么该节点就是子节点的父节点。
非终端节点(分支节点):度大于0的节点
树的度:树内各节点的度的最大值
节点的层次:从根开始定义其,根节点为第一层,根的子节点为第二次,类推……
树的高度(或深度):树中节点的最大层次
节点的祖先:从根到该节点所经分支上的所有节点 例如节点4的祖先是 节点1 2
森林: 由 m 棵互不相交的树的集合称为森林
2.树的表示
树的存储比较麻烦,并且涉及到可能含有多个子节点,通常采用孩子兄弟表示法
typedef int DataType;
struct Node
{
struct Node* firstChild;
struct Node* pNextBrother;
DataType data;
};
二、二叉树
1.二叉树的定义和相关概念
一棵二叉树是节点的一个有限集合,该集合或者为空,或者是由一个根节点加上两棵子树(左子树和右子树)的二叉树组成。
特点: 每个节点最多有2个子节点
二叉树的子树的顺序不能颠倒
2.特殊的二叉树
①.满二叉树:一个二叉树,每一层的节点数都达到 2^(n-1) (n为层数 即每层节点数达到最大值),此时总节点数为 2^k-1 (k为树的深度)。
②.完全二叉树
二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。
3.二叉树的存储结构
①顺序存储
顺序存储就是用数组来存储,但是顺序存储更适用于完全二叉树,不是完全二叉树会存在空间的浪费,而通常只有堆(一个完全二叉树)才会用数组存储。
②链式存储
链式存储是指运用链表存储,用链来表示元素间的关系。链表中每个节点由三个域组成(数据域,左右指针域),左右指针域表示该节点的左右子节点所在链节点的存储地址。另外,还可以由四个域组成,多一个父节点域,存储其父节点所在的地址。
typedef struct tree{
struct tree *left; // 存左子节点
struct tree *rigth;// 存右子节点
int data; // 数据域
}tree;
4.二叉树的性质
①若规定根节点的层数为1,则一棵非空二叉树的第 i 层 最多有 2^(i-1)个节点
②深度为 h 的二叉树的最大节点数是 2^h-1
③对任何一棵二叉树,如果叶子节点的个数为n1,度为2的分支节点为n2 则有n2=n1+1
④具有n个节点的满二叉树,其深度为h=log2(n+1)。
参考博文: 数据结构--二叉树--详解_有一棵二叉树,结点编号是1-n每个结点根子树权值和表示结点的个数,-****博客