这里写自定义目录标题
.树的概念
(1) 非线性的数据结构,由n个结点组成一个层次的关系,树的结构根部向上,叶子向下,像一颗倒挂着的树。
根结点为根结点,没有前驱结点。
树是由递归定义的。
(2)树的判断,
子树互不相交。
除了根结点外,每个结点只有一个父节点
结点的度:一个结点含有字数或叶子的个数。
叶节点或终端节点:度为0的结点。
树的度:树上某个拥有最多结点的个数,称为树的。
树的高度:树中结点的最大层次。
森林:由多个树组成的集合。
1.2树的表示
左孩子右兄弟
数据结构
typedef struct tree
{
size_t val;//数据
Tree* leftchild;
Tree* rightbro;
}
可以通过左孩子右兄弟,从根结点开始,可以找到第一个孩子,可以通过这个孩子,找到他的兄弟结点,可以形成一颗树
树在实际中的应用:目录
二叉树:
2.1概念:一个结点有俩个子节点,或一个根结点上连接俩个左子树和右子树、
二叉树的特点:1.每个结点最多有俩个子树,二叉树不存在度大于二的结点
2.二叉树左右不能颠倒。
特殊的二叉树:
满二叉树:一个二叉树,每一个结点的子树都为2(除了叶子结点),且叶子结点为满
完全二叉树:每一个子树的结点为2,叶子结点可以不为满,但是必须保证连续。
二叉树的存储结构:链式结构和顺序结构。
二叉树的性质:
1.若根结点的层数为零,则一颗二叉树第I层最多有2^i个结点
2.如果二叉树的深度为h(根结点规定为0),深度为h的二叉树最大结点数为2^(h=1)-1g个。
3。任意二叉树,叶节点个数为n0,度为2非叶结点个数为n2,,则n0 = n2+1.
顺序结构:
现实中我们通常把堆使用顺序结构的数组来存储,该堆为数据结构,而非操作系统中的堆区域
堆的定义:
一个关键码的集合,所有元素均按照完全二叉树使用顺序结构排布,根结点大的称为大根堆,根结点小的称为小根堆。
堆的性质:(逻辑结构为二叉树,物理结构为数组)
一颗完全二叉树
大堆:该节点必须小于父节点,大于子节点
小堆:该节点必须大于父节点,小于子节点
堆的实现:
1.堆向下调整算法
给出一个数组,逻辑上看作一个完全二叉树,子树均为堆。
//建小堆
void AdjustDown(int* a, size_t n, int root)//root为序列号
{
int parent = root;
int child = parent *2+1;
if(a[child] > a[child+1])
{
++child;
}
if(a[parent] > a[child])
{
int tmp = a[parent];
a[parent] = a[child];
tmp = a[child];
parent = child;
child = parent * 2+1;
}
else()
break;
}
堆的建立
从最后一个结点开始,依次向上调整,由于调整的时候可能会使子树的顺序颠倒,所以每一次调整都要递归进行一次排序
代码实现
for(int root = n-1-1/2, root >= 0, root --)
{
AdjustDown(a,n,root);
}
二叉树的链式结构存储
链式结构是沿着某条探索路线对二叉树的结点进行访问
1.前序遍历:先访问根节点,再访问左右子树;
2.中序遍历:先访问左子树,再访问根节点,最后访问右子树;
3.后序遍历:先访问左右子树,再访问根节点;
4.层序遍历:按照层序访问;
1 2 3 一般用递归实现