数据结构5-树与图
树形结构是一类重要的非线性数据结构 树是以分支关系定义的层级结构;数结构在客观世界中广泛存在(如人类社会族谱,社会组织机构关系等),同时在计算机领域以及数据库系统,树形结构也是重要的组织形式;
1.树的定义
由n个结点组成的有限集,n=0空树
n>0 有且仅有一个称做根的结点
n>1 互不相交的
2.树中基本的概念
结点的度: 结点的子树个数 度为0的结点 ---> 终端结点 叶子结点
树的度: 树中所有有结点 度的 最大值
树的层次:从根开始,根为第一层
树的深度(高度):树种结点最大层次
3.二叉树
树中每个结点最多有2个子树,(子节点中有左右之分)
特殊的二叉树:
完美二叉树:
除了最后一层终端结点,其余的结点的度都要为2
完全二叉树:
给每个结点进行编号,从上至下,从左至右,与完美二叉树进行比较,
如果所有的编号所在的位置是相同,就是
否则不是。
4.二叉树的性质
1. 一个二叉树 第i层 ,最多 2^i-1 结点
2.深度为k的二叉树,最多具有 2^k -1 结点
3.对于任何一个二叉树,终端结点的数目N0, 度为2的结点的个数为N2,则N0=N2+1
证明:
设 :度为1的结点的数目N1
结点的总数:N= N1+N2+N0
树中边的总数:N-1
树中边的总数: N1+2*N2 = N1+N0+N2 -1
N2=N0-1
4.假设给一棵完全二叉树结点编号,从上至下,从左至右,从1开始编号,那么编号i的结点,
左子结点的编号: 2*i
右子结点的编号:2*i+1
其父结点的编号:i/2
5.具有n个结点的完全二叉树深度为log2N 向下取整+1
证明:
5.二叉树的存储
1.顺序
typedef int E;
E data[MAX_NODE];
2.链式
struct Node
{
E data;
struct Node* lchild;//左子树的位置
struct Node* rchild;//右子树的位置
};
struct Tree
{
struct Node* root;
int height;//树的高度
int num;//结点的个数
};
6.二叉排序树(BST)
1. 如果左子树不空,左子树上的结点均小于 根结点
2. 如果右子树不空,右子树上的结点均大于 根结点
3. 左子树和右子树也是二叉排序树
树的创建:
struct BTree
{
struct Node* root;
int height; //树的高度
};
struct BTree* creatTree()
{
struct BTree* tree=(struct BTree*)malloc(sizeof(*tree));
tree->root=NULL;
tree->height=0;
return tree;
}
树具体请参考:https://download.csdn.net/download/pleboyzha/85035411
图
(1)图由 有限 的非空点集,边组成G(V,E)
(2)基本概念:
有向图: 弧 (有方向的边) 开始的点弧尾 ,结束的顶点叫做弧头
无向图: 边 (没有方向的边)
网:在边上加上某种信息w,w叫做边上的权,带权的图叫做网
顶点的度: 顶点的边或者说弧的条数
入度:以该顶点结束的边的条数
出度:以该顶点出发的边的条数
目的:路径: 1->2->3,如下图
(3)图的存储方式
1.顺序存储
数组表示法
#define MAX_VERTEX 100//声明最多的顶点的个数
struct G
{
int adj[MAX_VERTEX][MAX_VERTEX]//边的信息
int name[MAX_VERTEX];//顶点的名字
int adjNum;
int verNum;
};
2.链式存储
邻接表:
每一个结点都要有一个链表 ,由该顶点出发的边
struct Edge
{
char endName[20];//终端顶点的名字
int dis;//边的距离
struct Edge*next;
};
struct Vertex
{
char name[20];
struct Edge *first;
};
struct G
{
struct Vertex v[1000];
int verNum;//顶点的实际个数
步骤:
- 创建图
- 输入图信息
- 输出图
- 图遍历
遍历方式:(从某一个顶点出发,每一个顶点有且仅访问一次,最终访问的方式)
(1)深度优先
(2)广度优先
5.求最短路径方式查看具体的code方法:
图具体请参考:https://download.csdn.net/download/pleboyzha/85035411