数据结构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