网站关键词排名提高,只用html5做网站,结构化数据 wordpress,金蝶erp1.树概念及结构 1.1树的概念 
树是由根和子树构成 
树是一种非线性的数据结构#xff0c;它是由n#xff08;n0#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树#xff0c;也就是说它是根朝上#xff0c;而叶朝下的 1. 树有…1.树概念及结构 1.1树的概念 
树是由根和子树构成 
树是一种非线性的数据结构它是由nn0个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树也就是说它是根朝上而叶朝下的 1. 树有一个特殊的结点称为根结点根结点就是第一个节点 
2. 除根结点外其余结点被分成M(M0)个互不相交的集合T1、T2、……、Tm其中每一个集合Ti(1 i m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱可以有0个或多个子节点 
3. 树是递归定义的 
4.在树形结构中子树之间不能有交集否则就不是树 1.2 树的相关概念 节点的度一个节点含有的子树的个数称为该节点的度如上图A的为6A B C D E F G 
重要部分 
* 叶节点或终端节点子节点为0的节点称为叶节点 如上图B、C、H、I...等节点为叶节点 
* 非终端节点或分支节点度不为0的节点 如上图D、E、F、G...等结点为分支节点 
* 双亲结点或父结点若一个结点含有子结点则这个节点称为其子节点的父节点 如上图A是B的父节点 
* 孩子节点或子节点一个节点含有的子树的根节点称为该结点的子结点 如上图B是A的孩子节点 
* 树的高度或深度树中节点的最大层次 如上图树的高度为4 了解一下 
兄弟节点具有相同父节点的节点互称为兄弟节点 如上图B、C是兄弟节点 
树的度一棵树中最大的节点的度称为树的度 如上图树的度为6A B C D E F G 结点的层次从根开始定义起根为第1层根的子结点为第2层以此类推 
堂兄弟结点双亲在同一层的节点互为堂兄弟如上图H、I互为兄弟节点 
结点的祖先从根到该结点所经分支上的所有结点如上图A是所有节点的祖先 
子孙以某结点为根的子树中任一结点都称为该结点的子孙。如上图所有节点都是A的子孙 
森林由mm0棵互不相交的树的集合称为森林并查集文件系统 1.3 树的表示方法 
树结构存储表示起来比较麻烦既然保存值域也要保存结点和结点之间 
这里使用 左孩子右兄弟 表示法子节点和兄弟节点 
也就是说不管有多少个孩子每个节点只指向第一个孩子 1.A指向子节点BA没有兄弟节点指向空  
2.B指向子节点DB指向兄弟节点CC没有兄弟节点指向空  
3.D没有子节点D指向兄弟节点EE指向兄弟节点FF没有兄弟节点,指向空 
4.E指向子节点HH指向兄弟节点II没有兄弟节点指向空  struct TreeNode
{int val;struct Node* leftchild;struct Node* rightBrother;}; 2.二叉树概念及结构 2.1概念 
一棵二叉树是结点的一个有限集合该集合: 1. 或者为空 2. 由一个根结点加上两棵别称为左子树和右子树的二叉树组成  3. 二叉树不存在度大于2的结点 4.二叉树的子树有左右之分次序不能颠倒因此二叉树是有序树 2.2 特殊的二叉树 
1. 满二叉树每一个层的节点数都达到最大值则这个二叉树就是满二叉树 
也就是说如果一棵二叉树的层数为K且结点总数是(2^k - 1)则它就是满二叉树 2. 完全二叉树前h-1层都是满的最后一层不是满的最后一层从左到右必须是连续的如果不是连续的那么就不是完全二叉树 
连续的 不连续的  满二叉树是一种特殊的完全二叉树但是完全二叉树不是满二叉树 2.3 满二叉树和完全二叉树的位置计算 
假设父节点在数组中的下标为i那么 1.左孩子在数组中的下标为2*i1  2.右孩子在数组中的下标为2*i2 
假设孩子在数组中的下标为i那么 父在数组中的下标为i - 1/ 2 
在这里不区分左孩子和右孩子因为除以会向下取整 3. 堆的概念及结构 
3.1  
1. 堆中某个结点的值总是不大于或不小于其父结点的值 
2. 堆在逻辑上是一棵完全二叉树物理上就是数组 
3. 堆分为小堆和大堆 
大堆a. 完全二叉树 b. 任何一个父亲   儿子 
特点根是最小 小堆 a. 完全二叉树 b. 任何一个父亲   儿子 
特点根是最大 3.2 堆的实现 
Heap.h 
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#includestdio.h
#includeassert.h
#includestdlib.h
#includestdbool.htypedef int HPDataType;typedef struct Heap
{HPDataType* a;int size;int capacity;
}HP;//堆的初始化
void HPInit(HP* php);//堆的销毁
void HPDestroy(HP* php);//堆的插入
void HPPush(HP* php, HPDataType x);//堆的删除
void HPPop(HP* php);// 取堆顶的数据
HPDataType HPTop(HP* php);//堆的判空
bool HPEmpty(HP* php);void Swap(HPDataType* p1, HPDataType* p2);void AdjustUp(HPDataType* a, int child);void AdjustDown(HPDataType* a, int n, int parent); Heap.c分解分析 
堆的初始化 
//堆的初始化
void HPInit(HP* php)
{assert(php);php-a  NULL;php-size  php-capacity  0;
} 
堆的销毁 
//堆的销毁
void HPDestroy(HP* php)
{assert(php);free(php-a);php-a  NULL;php-size  php-capacity  0;
} 
堆的插入  
//堆的插入
void HPPush(HP* php, HPDataType x)
{assert(php);//判断内存是否满if (php-size  php-capacity){int newcapacity  php-capacity  0 ? 4 : php-capacity * 2;HPDataType* tmp  (HPDataType*)realloc(php-a, newcapacity * sizeof(HPDataType));if (tmp  NULL){perror(realloc fail);return;}php-a  tmp;php-capacity  newcapacity;}//插入数据php-a[php-size]  x;php-size;//插入数据之后需要向上调整AdjustUp(php-a, php-size - 1);
} 堆的插入逻辑交换图表向上调整 堆的插入数据之后是否向上调整 
//堆的插入数据之后是否向上调整
void AdjustUp(HPDataType* a, int child)
{//孩子/2找到父节点int parent  (child - 1) / 2;//孩子大于0就进入/继续while (child  0){//如果孩子小于父亲if (a[child]  a[parent]){Swap(a[child], a[parent]);//交换child  parent;parent  (child - 1) / 2;}else{break;}}
} 
堆的交换 
//堆的交换
void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp  *p1;*p1  *p2;*p2  tmp;
} 
堆的删除一般是删除根 
思路排序删除交换根和最后一个子节点的位置再删除根之后再进行向下调整算法向下调整的前提是左右子树都是大小堆然后根据左右子树的大小选择小的那个进行调整 //堆的删除
void HPPop(HP* php)
{assert(php);assert(php-size  0);//交换下标为0的根和末尾数据的位置Swap(php-a[0], php-a[php-size - 1]);php-size--;//删除//向下调整AdjustDown(php-a, php-size, 0);
} 堆的向下调整 
思路先假设左孩子小然后找出小的那个孩子再判断右孩子是否小于n并且右孩子小于左孩子  向下调整的前提是左右子树都是大小堆                                                 //堆的向下调整
void AdjustDown(HPDataType* a, int n, int parent)
{// 先假设左孩子小int child  parent * 2  1;// child  n说明孩子不存在调整到叶子了while (child  n) {// 找出小的那个孩子//判断右孩子是否小于n并且右孩子小于左孩子 if (child  1  n  a[child  1]  a[child]){child;}//if (a[child]  a[parent]) 大堆//孩子小于父亲if (a[child]  a[parent])//小堆{//交换Swap(a[child], a[parent]);parent  child;//赋予//继续算左孩子child  parent * 2  1;}else{break;}
} 取堆顶的数据 
// 取堆顶的数据
HPDataType HPTop(HP* php)
{assert(php);assert(php-size  0);return php-a[0];
} 
堆的判空 
//堆的判空
bool HPEmpty(HP* php)
{assert(php);return php-size  0;
} Heap.c全部代码 
#includeHeap.h//堆的初始化
void HPInit(HP* php)
{assert(php);php-a  NULL;php-size  php-capacity  0;
}//堆的销毁
void HPDestroy(HP* php)
{assert(php);free(php-a);php-a  NULL;php-size  php-capacity  0;
}//堆的插入
void HPPush(HP* php, HPDataType x)
{assert(php);//判断内存是否满if (php-size  php-capacity){int newcapacity  php-capacity  0 ? 4 : php-capacity * 2;HPDataType* tmp  (HPDataType*)realloc(php-a, newcapacity * sizeof(HPDataType));if (tmp  NULL){perror(realloc fail);return;}php-a  tmp;php-capacity  newcapacity;}//插入数据php-a[php-size]  x;php-size;//插入数据之后需要向上调整AdjustUp(php-a, php-size - 1);
}//堆的插入数据之后是否向上调整
void AdjustUp(HPDataType* a, int child)
{//孩子/2找到父节点int parent  (child - 1) / 2;//孩子大于0就进入/继续while (child  0){//如果孩子小于父亲if (a[child]  a[parent]){Swap(a[child], a[parent]);//交换child  parent;parent  (child - 1) / 2;}else{break;}}
}//堆的交换
void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp  *p1;*p1  *p2;*p2  tmp;
}//堆的删除
void HPPop(HP* php)
{assert(php);assert(php-size  0);//交换下标为0的根和末尾数据的位置Swap(php-a[0], php-a[php-size - 1]);php-size--;//删除//向下调整AdjustDown(php-a, php-size, 0);
}//堆的向下调整
void AdjustDown(HPDataType* a, int n, int parent)
{// 先假设左孩子小int child  parent * 2  1;// child  n说明孩子不存在调整到叶子了while (child  n) {// 找出小的那个孩子//判断右孩子是否小于n并且右孩子小于左孩子 if (child  1  n  a[child  1]  a[child]){child;}//if (a[child]  a[parent]) 大堆//孩子小于父亲if (a[child]  a[parent])//小堆{//交换Swap(a[child], a[parent]);parent  child;//赋予//继续算左孩子child  parent * 2  1;}else{break;}}
}// 取堆顶的数据
HPDataType HPTop(HP* php)
{assert(php);assert(php-size  0);return php-a[0];
}//堆的判空
bool HPEmpty(HP* php)
{assert(php);return php-size  0;
} 感谢观看~ 
 文章转载自: http://www.morning.cfybl.cn.gov.cn.cfybl.cn http://www.morning.tfgkq.cn.gov.cn.tfgkq.cn http://www.morning.ysqb.cn.gov.cn.ysqb.cn http://www.morning.qkqgj.cn.gov.cn.qkqgj.cn http://www.morning.rjfr.cn.gov.cn.rjfr.cn http://www.morning.hptbp.cn.gov.cn.hptbp.cn http://www.morning.tpqrc.cn.gov.cn.tpqrc.cn http://www.morning.yrctp.cn.gov.cn.yrctp.cn http://www.morning.kflpf.cn.gov.cn.kflpf.cn http://www.morning.bynf.cn.gov.cn.bynf.cn http://www.morning.hbqfh.cn.gov.cn.hbqfh.cn http://www.morning.kmwbq.cn.gov.cn.kmwbq.cn http://www.morning.zwpzy.cn.gov.cn.zwpzy.cn http://www.morning.fkgct.cn.gov.cn.fkgct.cn http://www.morning.kphsp.cn.gov.cn.kphsp.cn http://www.morning.rzrbw.cn.gov.cn.rzrbw.cn http://www.morning.znknj.cn.gov.cn.znknj.cn http://www.morning.pdgqf.cn.gov.cn.pdgqf.cn http://www.morning.bydpr.cn.gov.cn.bydpr.cn http://www.morning.wkkqw.cn.gov.cn.wkkqw.cn http://www.morning.tdxlj.cn.gov.cn.tdxlj.cn http://www.morning.sbrpz.cn.gov.cn.sbrpz.cn http://www.morning.jfjpn.cn.gov.cn.jfjpn.cn http://www.morning.zqbrd.cn.gov.cn.zqbrd.cn http://www.morning.jqmqf.cn.gov.cn.jqmqf.cn http://www.morning.jpqmq.cn.gov.cn.jpqmq.cn http://www.morning.hqbk.cn.gov.cn.hqbk.cn http://www.morning.rqlbp.cn.gov.cn.rqlbp.cn http://www.morning.pmjhm.cn.gov.cn.pmjhm.cn http://www.morning.fgtls.cn.gov.cn.fgtls.cn http://www.morning.fxxmj.cn.gov.cn.fxxmj.cn http://www.morning.xnnxp.cn.gov.cn.xnnxp.cn http://www.morning.znrlg.cn.gov.cn.znrlg.cn http://www.morning.bqyb.cn.gov.cn.bqyb.cn http://www.morning.tbjb.cn.gov.cn.tbjb.cn http://www.morning.qtwd.cn.gov.cn.qtwd.cn http://www.morning.jwxnr.cn.gov.cn.jwxnr.cn http://www.morning.rbkl.cn.gov.cn.rbkl.cn http://www.morning.fpbj.cn.gov.cn.fpbj.cn http://www.morning.nxwk.cn.gov.cn.nxwk.cn http://www.morning.fhqdb.cn.gov.cn.fhqdb.cn http://www.morning.sqqds.cn.gov.cn.sqqds.cn http://www.morning.yqwsd.cn.gov.cn.yqwsd.cn http://www.morning.mjzcp.cn.gov.cn.mjzcp.cn http://www.morning.sjli222.cn.gov.cn.sjli222.cn http://www.morning.tnjff.cn.gov.cn.tnjff.cn http://www.morning.rlhjg.cn.gov.cn.rlhjg.cn http://www.morning.bfmq.cn.gov.cn.bfmq.cn http://www.morning.zlnmm.cn.gov.cn.zlnmm.cn http://www.morning.lmqw.cn.gov.cn.lmqw.cn http://www.morning.srxhd.cn.gov.cn.srxhd.cn http://www.morning.mftzm.cn.gov.cn.mftzm.cn http://www.morning.qcbhb.cn.gov.cn.qcbhb.cn http://www.morning.zhffz.cn.gov.cn.zhffz.cn http://www.morning.gnghp.cn.gov.cn.gnghp.cn http://www.morning.zdwjg.cn.gov.cn.zdwjg.cn http://www.morning.bhbxd.cn.gov.cn.bhbxd.cn http://www.morning.kdtdh.cn.gov.cn.kdtdh.cn http://www.morning.aiai201.cn.gov.cn.aiai201.cn http://www.morning.ysjjr.cn.gov.cn.ysjjr.cn http://www.morning.qstjr.cn.gov.cn.qstjr.cn http://www.morning.rfljb.cn.gov.cn.rfljb.cn http://www.morning.yrck.cn.gov.cn.yrck.cn http://www.morning.cnvlog.cn.gov.cn.cnvlog.cn http://www.morning.lzqnj.cn.gov.cn.lzqnj.cn http://www.morning.lgmgn.cn.gov.cn.lgmgn.cn http://www.morning.ljzss.cn.gov.cn.ljzss.cn http://www.morning.mhybs.cn.gov.cn.mhybs.cn http://www.morning.krjyq.cn.gov.cn.krjyq.cn http://www.morning.qzqfq.cn.gov.cn.qzqfq.cn http://www.morning.kydrb.cn.gov.cn.kydrb.cn http://www.morning.wdhlc.cn.gov.cn.wdhlc.cn http://www.morning.ggnjq.cn.gov.cn.ggnjq.cn http://www.morning.jcwrb.cn.gov.cn.jcwrb.cn http://www.morning.xsymm.cn.gov.cn.xsymm.cn http://www.morning.pljxz.cn.gov.cn.pljxz.cn http://www.morning.pwmpn.cn.gov.cn.pwmpn.cn http://www.morning.dndk.cn.gov.cn.dndk.cn http://www.morning.kqpsj.cn.gov.cn.kqpsj.cn http://www.morning.hkgcx.cn.gov.cn.hkgcx.cn