数据结构5-树与图

数据结构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. 输入图信息
  3. 输出图
  4. 图遍历
    遍历方式:(从某一个顶点出发,每一个顶点有且仅访问一次,最终访问的方式)
    (1)深度优先
    (2)广度优先
    5.求最短路径方式查看具体的code方法:
    图具体请参考:https://download.csdn.net/download/pleboyzha/85035411