树等的学习

Python 机器学习 K-近邻算法 KD树 在使用K-近邻(KNN)算法时,kd树(k-dimensional tree)是一种用于减少计算距离次数从而提高搜索效率的数据结构。kd树是一种特殊的二叉树,用于存储k维空间中的数据点,使得搜索最近邻点更加高效。KD树的构造过程是将数据分割成更小的区域,直到每个区域满足特定的终止条件。 阅读详情

目录

目录

一、基本概念

二、二叉树的性质

三、树的操作

树的操作包括:

(一)树的初始化

(二)树的操作

三、总代码



一、基本概念

1、树的结构是双亲与孩子,也可以理解为一个节点有一个数据域和两个指针域(左右指针域)

2、二叉树树的遍历:前序、中序、后序、层序

3、已知二叉树的前序排列和中序排列,则可以确定树的形状

4、狭义上:每棵树都有一个根节点,根节点是唯一的

     广义上:每个树可以分为多个小树,所以广义的根节点也有多个

上图中,(a)中的根节点为序号1,此时的1即为狭义的根节点,也是广义的根节点,

(b)中的根节点是序号2,为狭义的根节点,因为(b)是(a)的小树,(c)同理;

二、二叉树的性质

性质1:在二叉树的第i层上至多有2^(i-1)个结点(i>=1)

性质2:深度为k的二叉树至多有2^k-1个结点(k>=1)

性质3:任一个二叉树,如果其终端结点数为n0(度为0的结点),度为2的结点数为n2,度为1的结点数为n1,则满足n0=n2+1;

理解性质3:

(1)从点的角度来看,终端结点数为n0(度为0的结点),度为2的结点数为n2,度为1的结点数为n1,则n=n0+n1+n2(式子一)

(2)从结点头上的线来看,每个结点的头上都会有1条线,头上总线有n-1(因为根节点没有头上的线);

而度为2的结点说明下面有2条线,度为1的结点说明下面有1条线,度为0的结点说明下面有0条线,则脚下总线有2*n2+1*n1+0*n0;

头上的总线应该=脚下的总线,故n-1=2*n2+1*n1+0*n0(式子二);

(3)解式子一和式子二,可得n0=n2+1;

性质4:具有n个结点的完全二叉树的深度为log_{2}n+1(向下取整数)

性质5:

  1. 结点i的左孩子是2i,右孩子是2i+1;(主)
  2. 如果左孩子的标号为x,则双亲的标号为x/2;(推)
  3. 若果右孩子的标号为y,则双亲的标号为(y-1)/2;(推)

三、树的操作

树的操作包括:

(一)树的初始化

1、树的节点结构

typedef struct treeNode
{
	int val;//数据域
	struct treeNode *lchild,*rchild;//左孩子右孩子,指针域
}BTNode;

2、树的维护结构

typedef struct
{
	int num;//计数
	BTNode *root;//根节点
}RTree;

    树的维护结构初始化

RTree* Init()
{
 	RTree *st=(RTree*)malloc(sizeof(RTree));
	st->num=0;
	st->root=NULL;
	return st;
}

(二)树的操作

1、新建树

void inserArrBTree(RTree *st,int *arr,int n)//插入树(树维护的地址,要插入的数组地址,要插入的数组元素的个数)
{
	int i=1;//数组的下标指针
	int head,rear;//定义队的头尾指针
	BTNode* queue[20]={0};//创建一个队列(用结构体指针数组实现,用来存放节点的指针)
	BTNode* cur;//出队的指针存储
	if(!st) return;
	if(st->root==NULL)//如果是第一个根节点则:
	{
		st->root=(BTNode*)malloc(sizeof(BTNode));//申请节点的内存空间赋给根节点
		st->root->lchild=st->root->rchild=NULL;//将节点的左右孩子都置为空
		st->root->val=arr[0];//将数组第一个数据存入根节点的数据域,往后的数据从i=1开始,到n-1结束
		st->num++;
	}

	//指针队列初始化
	head=-1;//头指针处没有数据的(参见队列的内容)
	rear=-1;//初始化队列,空队列head=rear
	queue[++rear]=st->root;//将根节点入队
		
	while(i<n)
	{
		cur=queue[++head];//队头(下标小的)出队
		
		if(cur->lchild)//左孩子如果不为空有节点
		{
			queue[++rear]=cur->lchild;//将这个节点入队
			st->num++;
		}
		else//左孩子如果为空没有节点
		{
			cur->lchild=(BTNode*)malloc(sizeof(BTNode));//申请新节点的内存和初始化
			cur->lchild->lchild=cur->lchild->rchild=NULL;
			cur->lchild->val=arr[i++];//将数组元素放入新的节点
			queue[++rear]=cur->lchild;
			st->num++;
		}

		if(i==n)break;//如果数组待处理的元素没有了,则返回

		if(cur->rchild)//右孩子如果不为空有节点
		{
			queue[++rear]=cur->rchild;//将这个节点入队
			st->num++;
		}
		else//右孩子如果为空没有节点
		{
			cur->rchild=(BTNode*)malloc(sizeof(BTNode));//申请新节点的内存和初始化
			cur->rchild->lchild=cur->rchild->rchild=NULL;
			cur->rchild->val=arr[i++];//将数组元素放入新的节点
			queue[++rear]=cur->rchild;
			st->num++;
		}
	}	
}

2、判断树空

int treenull(RTree* tp)
{
	return (!tp) ? 0 : ((!tp->num) ? 0 : 1); 
}

3、树的高度计算

int gaodufuzhu(BTNode* s)//树高度的计算辅助函数
{
	int left=0,right=0;//左右的高度
	if(!s)return 0;
	left=gaodufuzhu(s->lchild);
	right=gaodufuzhu(s->rchild);
	return (left>right) ? left+1 : right+1;//三目运算,left>right时返回left+1,否则left<right时返回right+1
}
int gaodu(RTree* tp)//树高度的计算调用函数
{
	if(!tp)return 0;
	return gaodufuzhu(tp->root);
}

4、清空树

int clearfuzhu(BTNode* tp,int *n)//-1(空),n为 计数变量的地址
{
	int left,right;
	if(!tp) 
		return -1;
	left=clearfuzhu(tp->lchild,n);//递归算法
	right=clearfuzhu(tp->rchild,n);
	if((left==right)==-1);
	{
		free(tp);
		(*n)--;//*指针取值符,取出计数单位进行减操作
		return -1;
	}
	return 0;
}
int cleartree(RTree* st)//清空树的调用
{
	if(!st || !(st->num)) return 0;
	return clearfuzhu(st->root,&(st->num));//st->root是根节点的地址,&(st->num)是计数变量的地址
}

5、查找树的数据是否存在

BTNode* fuzhufind(BTNode* tp,int n)//返回的是一个节点的地址,n代表要查找的数据
{
	BTNode *left,*right;//定义左树根的地址(广义的根)和右树的根的地址(广义的根)
	if(!tp)return NULL;//判断广义节点是否为空
	if(tp->val==n)//广义节点部位空,查验此时的广义根的数据是否等于我们要找的数据
		return tp;//如果等于则返回这个广义节点的地址
	left=fuzhufind(tp->lchild,n);//若不等于则继续对这个广义节点的左孩子递归
	right=fuzhufind(tp->rchild,n);//左孩子结束后对右孩子递归
	return left ? left : (right ? right : NULL);//三目运算符,a?b:c--如果a为真则b执行,否则c执行
												//如果是在树的左边找到的,则返回左值,否则返回右值,没有找到返回NULL
}
BTNode* findtree(RTree* st,int n)//查找调用(根节点的地址,查找的数值),返回的是一个节点的地址
{
	if(!st) return NULL;//如果根节点为空,则返回空
	return fuzhufind(st->root,n);//调用查找的辅助函数并返回节点的地址
}

6、遍历(前中后层)

//前序遍历
void Qprinttree(BTNode* tp)//前序遍历递归(自动)
{
	if(!tp) return;//tp指向的是根节点(广义的根节点,把树细分蔚多个子树)
	printf("%d ",tp->val);//输出根数据
	Qprinttree(tp->lchild);//看根的左孩子,如果左孩子存在,则输出,否则左孩子为空,则返回上一级
	Qprinttree(tp->rchild);//返回上一级后再看右,同样的,看右孩子是否存在,不存在返回上一级,存在就输出
}
void Qpreshowtree(RTree* st)//前序输出调用
{
	if(!st) return;
	printf("前续遍历结果:");
	Qprinttree(st->root);
	putchar('\n');
}

//中序遍历
void Zprinttree(BTNode* tp)//中序遍历递归(自动)
{
	if(!tp) return;//tp指向的是根节点(广义的根节点,把树细分蔚多个子树)
	Zprinttree(tp->lchild);//看根的左孩子,如果左孩子存在,那么继续找左孩子的左孩子
	printf("%d ",tp->val);//左孩子不存在,则返回上一级输出根数据
	Zprinttree(tp->rchild);//再看这个根的右孩子,如果右孩子存在,那么继续找右孩子的左孩子
}
void Zpreshowtree(RTree* st)//中序输出调用
{
	if(!st) return;
	printf("中续遍历结果:");
	Zprinttree(st->root);
	putchar('\n');
}

//后序遍历,先叶子后节点
void Hprinttree(BTNode* tp)//后序遍历递归(自动)
{
	if(!tp) return;//tp指向的是根节点(广义的根节点,把树细分蔚多个子树)
	Hprinttree(tp->lchild);//看根的左孩子
	Hprinttree(tp->rchild);//再看这个根的右孩子
	printf("%d ",tp->val);//左右孩子都不存在,说明这是叶子,则输出数据
}
void Hpreshowtree(RTree* st)//后序输出调用,
{
	if(!st) return;
	printf("后续遍历结果:");
	Hprinttree(st->root);
	putchar('\n');
}

//层序遍历
void Cprinttree(BTNode* tp)//tp指向节点
{
	BTNode* queue[20]={0};//定义一个队列(结构体指针数组),用来存放节点结构体的地址
	BTNode* cur=NULL;//存放出队的节点地址(数组元素)
	int head=-1,rear=-1;//初始化队列,空队列head=rear
	queue[++rear]=tp;//将根入队
	while(head!=rear)//如果队列不为空则
	{
		cur=queue[++head];//将队头节点出队赋给cur
		printf("%d ",cur->val);//输出节点数据
		if(cur->lchild)//判断节点是否有左孩子
		{
			queue[++rear]=cur->lchild;//有则入队
		}
		if(cur->rchild)//判断节点是否有右孩子
		{
			queue[++rear]=cur->rchild;//有则入队
		}
	}
}
void Cpreshowtree(RTree* st)//层序遍历调用
{
	if(!st) return;
	printf("层序遍历结果:");
	Cprinttree(st->root);//将树的根地址作为参数
	putchar('\n');
}

7、主函数

void main()
{
	int arr[maxsize]={3,1,2,5,4,7,9};//树的数据
	BTNode* tp=NULL;//新的节点
	RTree* st=NULL;//根节点
	int bl=-1;//树空的判断
	st=Init();//维护结构初始化
	inserArrBTree(st,arr,maxsize);//层序建树
	printf("树的节点数为:%d\n",st->num);
	putchar('\n');
	Qpreshowtree(st);//前序输出
	Zpreshowtree(st);//中序输出
	Hpreshowtree(st);//后续输出
	Cpreshowtree(st);//层序输出
	putchar('\n');

	//cleartree(st);//清空树
	//if(st->num==0)printf("清空完成\n");
	//putchar('\n');

	tp=findtree(st,1);
	printf("查找树:");
	if(tp==NULL)
	{
		printf("查找失败!\n");
	}
	else
		printf("查找成功!\n");
	putchar('\n');

	printf("树的高度为:%d\n",gaodu(st));
	putchar('\n');

	/*bl=treenull(st);
	if(bl==0)printf("树为空\n");
	if(bl==1)printf("树不为空\n");
	putchar('\n');*/
}

三、总代码

#include<stdio.h>
#include <stdlib.h> 
#define maxsize 7//数组的最大容量maxsize

//树的节点结构
typedef struct treeNode
{
	int val;//数据域
	struct treeNode *lchild,*rchild;//左孩子右孩子,指针域
}BTNode;

//树的维护结构
typedef struct
{
	int num;//计数
	BTNode *root;//根节点
}RTree;

//对维护结构的初始化
RTree* Init()
{
 	RTree *st=(RTree*)malloc(sizeof(RTree));
	st->num=0;
	st->root=NULL;
	return st;
}

//判断树空
int treenull(RTree* tp)
{
	return (!tp) ? 0 : ((!tp->num) ? 0 : 1); 
}

//树的高度
int gaodufuzhu(BTNode* s)//树高度的计算辅助函数
{
	int left=0,right=0;//左右的高度
	if(!s)return 0;
	left=gaodufuzhu(s->lchild);
	right=gaodufuzhu(s->rchild);
	return (left>right) ? left+1 : right+1;//三目运算,left>right时返回left+1,否则left<right时返回right+1
}
int gaodu(RTree* tp)//树高度的计算调用函数
{
	if(!tp)return 0;
	return gaodufuzhu(tp->root);
}

//新建树(层序建立)
void inserArrBTree(RTree *st,int *arr,int n)//插入树(树维护的地址,要插入的数组地址,要插入的数组元素的个数)
{
	int i=1;//数组的下标指针
	int head,rear;//定义队的头尾指针
	BTNode* queue[20]={0};//创建一个队列(用结构体指针数组实现,用来存放节点的指针)
	BTNode* cur;//出队的指针存储
	if(!st) return;
	if(st->root==NULL)//如果是第一个根节点则:
	{
		st->root=(BTNode*)malloc(sizeof(BTNode));//申请节点的内存空间赋给根节点
		st->root->lchild=st->root->rchild=NULL;//将节点的左右孩子都置为空
		st->root->val=arr[0];//将数组第一个数据存入根节点的数据域,往后的数据从i=1开始,到n-1结束
		st->num++;
	}

	//指针队列初始化
	head=-1;//头指针处没有数据的(参见队列的内容)
	rear=-1;//初始化队列,空队列head=rear
	queue[++rear]=st->root;//将根节点入队
		
	while(i<n)
	{
		cur=queue[++head];//队头(下标小的)出队
		
		if(cur->lchild)//左孩子如果不为空有节点
		{
			queue[++rear]=cur->lchild;//将这个节点入队
			st->num++;
		}
		else//左孩子如果为空没有节点
		{
			cur->lchild=(BTNode*)malloc(sizeof(BTNode));//申请新节点的内存和初始化
			cur->lchild->lchild=cur->lchild->rchild=NULL;
			cur->lchild->val=arr[i++];//将数组元素放入新的节点
			queue[++rear]=cur->lchild;
			st->num++;
		}

		if(i==n)break;//如果数组待处理的元素没有了,则返回

		if(cur->rchild)//右孩子如果不为空有节点
		{
			queue[++rear]=cur->rchild;//将这个节点入队
			st->num++;
		}
		else//右孩子如果为空没有节点
		{
			cur->rchild=(BTNode*)malloc(sizeof(BTNode));//申请新节点的内存和初始化
			cur->rchild->lchild=cur->rchild->rchild=NULL;
			cur->rchild->val=arr[i++];//将数组元素放入新的节点
			queue[++rear]=cur->rchild;
			st->num++;
		}
	}	
}

//清空树
int clearfuzhu(BTNode* tp,int *n)//-1(空),n为 计数变量的地址
{
	int left,right;
	if(!tp) 
		return -1;
	left=clearfuzhu(tp->lchild,n);//递归算法
	right=clearfuzhu(tp->rchild,n);
	if((left==right)==-1);
	{
		free(tp);
		(*n)--;//*指针取值符,取出计数单位进行减操作
		return -1;
	}
	return 0;
}
int cleartree(RTree* st)//清空树的调用
{
	if(!st || !(st->num)) return 0;
	return clearfuzhu(st->root,&(st->num));//st->root是根节点的地址,&(st->num)是计数变量的地址
}

//查找树的数据是否存在
BTNode* fuzhufind(BTNode* tp,int n)//返回的是一个节点的地址,n代表要查找的数据
{
	BTNode *left,*right;//定义左树根的地址(广义的根)和右树的根的地址(广义的根)
	if(!tp)return NULL;//判断广义节点是否为空
	if(tp->val==n)//广义节点部位空,查验此时的广义根的数据是否等于我们要找的数据
		return tp;//如果等于则返回这个广义节点的地址
	left=fuzhufind(tp->lchild,n);//若不等于则继续对这个广义节点的左孩子递归
	right=fuzhufind(tp->rchild,n);//左孩子结束后对右孩子递归
	return left ? left : (right ? right : NULL);//三目运算符,a?b:c--如果a为真则b执行,否则c执行
												//如果是在树的左边找到的,则返回左值,否则返回右值,没有找到返回NULL
}
BTNode* findtree(RTree* st,int n)//查找调用(根节点的地址,查找的数值),返回的是一个节点的地址
{
	if(!st) return NULL;//如果根节点为空,则返回空
	return fuzhufind(st->root,n);//调用查找的辅助函数并返回节点的地址
}




//前序遍历
void Qprinttree(BTNode* tp)//前序遍历递归(自动)
{
	if(!tp) return;//tp指向的是根节点(广义的根节点,把树细分蔚多个子树)
	printf("%d ",tp->val);//输出根数据
	Qprinttree(tp->lchild);//看根的左孩子,如果左孩子存在,则输出,否则左孩子为空,则返回上一级
	Qprinttree(tp->rchild);//返回上一级后再看右,同样的,看右孩子是否存在,不存在返回上一级,存在就输出
}
void Qpreshowtree(RTree* st)//前序输出调用
{
	if(!st) return;
	printf("前续遍历结果:");
	Qprinttree(st->root);
	putchar('\n');
}

//中序遍历
void Zprinttree(BTNode* tp)//中序遍历递归(自动)
{
	if(!tp) return;//tp指向的是根节点(广义的根节点,把树细分蔚多个子树)
	Zprinttree(tp->lchild);//看根的左孩子,如果左孩子存在,那么继续找左孩子的左孩子
	printf("%d ",tp->val);//左孩子不存在,则返回上一级输出根数据
	Zprinttree(tp->rchild);//再看这个根的右孩子,如果右孩子存在,那么继续找右孩子的左孩子
}
void Zpreshowtree(RTree* st)//中序输出调用
{
	if(!st) return;
	printf("中续遍历结果:");
	Zprinttree(st->root);
	putchar('\n');
}

//后序遍历,先叶子后节点
void Hprinttree(BTNode* tp)//后序遍历递归(自动)
{
	if(!tp) return;//tp指向的是根节点(广义的根节点,把树细分蔚多个子树)
	Hprinttree(tp->lchild);//看根的左孩子
	Hprinttree(tp->rchild);//再看这个根的右孩子
	printf("%d ",tp->val);//左右孩子都不存在,说明这是叶子,则输出数据
}
void Hpreshowtree(RTree* st)//后序输出调用,
{
	if(!st) return;
	printf("后续遍历结果:");
	Hprinttree(st->root);
	putchar('\n');
}

//层序遍历
void Cprinttree(BTNode* tp)//tp指向节点
{
	BTNode* queue[20]={0};//定义一个队列(结构体指针数组),用来存放节点结构体的地址
	BTNode* cur=NULL;//存放出队的节点地址(数组元素)
	int head=-1,rear=-1;//初始化队列,空队列head=rear
	queue[++rear]=tp;//将根入队
	while(head!=rear)//如果队列不为空则
	{
		cur=queue[++head];//将队头节点出队赋给cur
		printf("%d ",cur->val);//输出节点数据
		if(cur->lchild)//判断节点是否有左孩子
		{
			queue[++rear]=cur->lchild;//有则入队
		}
		if(cur->rchild)//判断节点是否有右孩子
		{
			queue[++rear]=cur->rchild;//有则入队
		}
	}
}
void Cpreshowtree(RTree* st)//层序遍历调用
{
	if(!st) return;
	printf("层序遍历结果:");
	Cprinttree(st->root);//将树的根地址作为参数
	putchar('\n');
}

void main()
{
	int arr[maxsize]={3,1,2,5,4,7,9};//树的数据
	BTNode* tp=NULL;//新的节点
	RTree* st=NULL;//根节点
	int bl=-1;//树空的判断
	st=Init();//维护结构初始化
	inserArrBTree(st,arr,maxsize);//层序建树
	printf("树的节点数为:%d\n",st->num);
	putchar('\n');
	Qpreshowtree(st);//前序输出
	Zpreshowtree(st);//中序输出
	Hpreshowtree(st);//后续输出
	Cpreshowtree(st);//层序输出
	putchar('\n');

	//cleartree(st);//清空树
	//if(st->num==0)printf("清空完成\n");
	//putchar('\n');

	tp=findtree(st,1);
	printf("查找树:");
	if(tp==NULL)
	{
		printf("查找失败!\n");
	}
	else
		printf("查找成功!\n");
	putchar('\n');

	printf("树的高度为:%d\n",gaodu(st));
	putchar('\n');

	/*bl=treenull(st);
	if(bl==0)printf("树为空\n");
	if(bl==1)printf("树不为空\n");
	putchar('\n');*/
}

机器学习中基于树的模型 有没有想过机器是如何做出复杂决策的?就像一棵树分叉一样,机器学习中基于树的模型也做了类似的事情。它们是人工智能决策过程的支柱。在接下来的几节中,我们将探讨不同类型的基于树的模型。我们从基础开始:决策树。然后,我们扩展到随机森林和梯度提升机器。每个都有其独特的处理数据和决策的方式。 阅读详情

相关推荐

16、多维树学习算法解析

本博文深入解析了多维树学习算法的理论基础与实现过程。从多维树和自动机的基本定义出发,逐步介绍了多维树的表示方法、自动机的工作原理以及多维树的产量操作。在此基础上,详细阐述了多维树学习算法的核心机制,包括观察表的构建、封闭性与一致性检查、自动机推导等步骤,并通过引理和定理证明保证了算法的正确性和高效性。此外,还分析了该算法在自然语言处理、图像视频处理、生物信息学等领域的应用前景,为未来的研究和优化提供了方向。

u5v6w7的博客 70

二叉树的删除代码(包含所有情况)

二叉树的删除 1、分类讨论 如图 节点可以分为3种类型 0个子树:删除①,先寻找 ①,再寻找①的父节点②,通过父节点②指向空(null)来实现删除①。 1个子树:删除⑦,先寻找 ⑦,再寻找⑦的父节点⑤,让⑤直接指向⑦的左或者右子树来实现删除⑦。 2个子树:删除②,先寻找 ②,找到②右子树的最小值或者左子树的最大值,将②变成那个值,并删除那个值。 2、代码 search通过value值找到目标节点,使用递归的方法查找 public TreeNode search(TreeNode root,Int

PDyee的博客 1037

15、多维树学习算法:超越上下文无关性的学习

本文探讨了多维树学习算法,重点研究如何将Drewes和Högberg的正则树语言学习算法推广至处理任意维度的可识别树语言。通过引入多维树的新类项表示形式,并对有限状态自动机和yield操作进行适配定义,证明了算法的基本属性得以保留。文章还分析了多维树语言与上下文无关语言、树邻接文法(TAG)等的关系,展示了该方法在超越上下文无关性语言类中的潜力。最后,提出了未来的研究方向,包括算法优化、应用拓展和理论深化,为推动语言学习技术的发展奠定了基础。

u5v6w7的博客 62

树的学习

树的学习缘由 leetcode每次周赛基本都会有一道树的题目,一直对这块的学习没那么深入,一般做出来的题目都是用递归去做,没有感受到树的优缺点。 这篇文章就作为树的深入学习的起点,之后各种树都尽量去了解和学习他们的代码写法和优缺点。 树的构建 因为目前树的使用基本知识leetcode上的做题,所以这次以leetcode上根据输入内容构建一颗树来开始树的学习。 以后写树的题目这块就可以做为基础类来本...

gfk111的博客 232

Unity3D 简单水面shader的实现

实现思路 今天来实现一个简单的水面效果。水面的话主要是以下几个效果叠加 1.水面的动态波浪效果,我们这里使用最简单的正弦波加上法线贴图来模拟。如果想要更精确的波动效果可以考虑使用Gerstner波 2.不同水深颜色不同的效果,使用该顶点深度和顶点坐标的差值来计算深度,然后映射到颜色 3.浪涌效果,还是根据顶点深度和顶点坐标的差值来计算深度,然后叠加上一层浪涌 4.折射效果,用grabpass,采样之后进行偏移,最后叠加上去。 代码实现 首先是顶点位移函数,使用正弦函数代入顶点的x坐标和z坐标来算,因为这里写

o83290102o5的博客 1万+

MFC下使用C++操作Word文档

由于项目需求,在MFC环境下操作将数据和图片写入word文档,之前没有接触过,网上查阅了很多资料,终于把任务完成。理解的不是很透彻,但是这些东西应该够用了,写篇博客记录一下,以便以后再用到。 (1)VS环境下创建一个MFC应用程序,然后在项目上单击右键,选择 类向导-----添加类----类型库中的MFC类。在弹出的对话框中选择文件,位置选择office安装目录下的...

GIS_yuhua的博客 7579

Unbutu下学习树

顺序存储结构:完全二叉树节点的编号方法是从上到下,从左到右,根节点为1号节点。2、树中任何节点都可以有零个或多个直接后继节点(子节点),但至少只有一个直接前趋节点(父节点),满叉数:深度为k(k>=1)时有2^(k-1)个节点的二叉树。二叉树是n(n>=0)个节点的有限集合,或者是空集(n=0)二叉树第i(i>=1)层上的节点最多为2^(i-1)个。当 i>1(不是根节点)时,有父节点,其编号为 i/2。深度为k(k>=1)的二叉树最多有2^k-1个节点。1、一个节点的子树的个数称为该节点的度数。

Security_的博客 426

C#教程

C# 教程 C# 是一个简单的、现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的。 本教程将告诉您基础的 C# 编程,同时将向您讲解 C# 编程语言相关的各种先进理念。 现在开始学习 C#! C# 在线工具 谁适合阅读本教程? 本教程有助于初学者理解基础的 C# 编程。在学习完本教程后,您将到达一个中级的 C# 编程水平。

zm1_1zm 1万+

C++学习——树(一)

本文为《C++学习》的第6篇文章,今天学习树。

weixin_72870689的博客 613

实战指南:用Python实现ONVIF WS-Discovery设备发现(附完整代码)

本文提供了一份详细的实战指南,介绍如何使用Python实现基于ONVIF标准的WS-Discovery设备发现协议。文章深入解析了协议原理、网络通信模型,并提供了完整的代码实现,帮助开发者快速构建智能安防和物联网应用中的设备自动发现工具,有效提升网络设备集成与管理的效率。

chair的专栏 1114

从0到1打造工业级上位机:通信协议到架构设计的实战全流程

作为一名在工控领域摸爬滚打十余年的开发者,前阵子刚帮一家新能源工厂完成了一套工业上位机系统的从0到1搭建。从最初和PLC通信联调时的“连不上、传错数”,到最终系统7×24小时稳定运行,踩过的坑、攒下的实战经验,今天就毫无保留地拆解给各位同行。这篇文章会从通信层、数据层、UI层到架构层逐层深入,全是工业现场验证过的干货,新手也能跟着落地。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 664

ProcessOn学习树

工具学习之ProcessOn

时光 255

智能车浅谈——手把手让车跑起来(电磁篇)

手把手让你的电磁车上路。

qq_41954556的博客 7万+

树的学习总结

文章目录前言一、树和森林的基本术语、概念二、二叉树1.概念、定义、储存机构2.操作3.应用总结欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 前言 树的学习已经告一段落了,本文将作为树学习.

qq_51726651的博客 853

大数据分析案例-基于随机森林算法构建二手房价格预测模型

通过应用随机森林算法,我们希望建立一个能够有效预测二手房价格的模型。这个模型可以基于各种因素,如区域位置、房屋属性、市场供需等,来预测未来某一时间点的房价。通过提高预测准确性,我们可以更好地把握房地产市场动态,为决策提供更有价值的参考。揭示影响二手房价格的因素及其影响方式:通过分析随机森林算法生成的模型,我们可以进一步了解哪些因素对二手房价格有重要影响,以及这些因素如何影响房价。这有助于我们深入理解房地产市场的运行规律,为制定更为有效的市场策略提供依据。

m0_64336780的博客 1万+

大数据ZooKeeper(一):ZooKeeper基本知识

Zookeeper是一个分布式协调服务的开源框架。主要用来解决分布式集群中应用系统的一致性问题。ZooKeeper本质上是一个。

Lansonli(蓝深李)的博客 3150

笛卡尔树学习笔记

笛卡尔树学习笔记

Dyc780511的博客 1077

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

基环树学习笔记

基环树学习笔记

Dyc780511的博客 1355

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

虚树学习笔记

虚树学习笔记

Dyc780511的博客 1124

基于树的模型的机器学习

This is a memo to share what I have learnt in Machine Learning with Tree-Based Models (using Python), capturing the learning objectives as well as my personal notes. The course is taught by Elie Kawer...

weixin_26752765的博客 465

AVL树学习笔记

首先对于5节点来说,原来的平衡因子为0,因此原来的5左右子树高度均相等,当在a中插入了一个新节点,也就是5的左子树,那么5节点的平衡因子就需要--,变为了-1,我们之前说过,如果是变为了-1/1,就需要继续向上更新,那么直到根节点,变为-2,此时我们就需要进行旋转。这是右单旋的通用图(-2,-1),我们从中可以看到,a,b,c 三棵树的高度均为h,但是实际上,根节点的左子树多了一个节点5,所以对于10来说是左边高右边低,相差高度为1,因此我们在c插入不会影响整棵树的平衡(所以我们只讨论在a,b中插入。

2301_77162468的博客 1280

前缀树学习

假如我们只构建一个只有26个英文小写字母的前缀树那么children的长度就是26 ,如果children[i] 不为空,那么证明有某个单词使用了这个前缀。

sjsjsbbsbsn的博客 493

Huffman树学习

&#13; 一篇很好的博客 &#13; &#13; &#13; &#13; &#13; &#13; &#13; &#13; &#13; &#13; &#13; &#13;

eternal风度 86

《机器学习实战》学习笔记第九章-树回归

树回归通过构建决策节点把数据数据切分成区域,然后局部区域进行回归拟合。

isla77的博客 525

机器学习算法——KD树算法介绍以及案例介绍

kd树(k-dimensional树的简称),是一种分割k维数据空间的数据结构,主要应用于多维空间关键数据的近邻查找(Nearest Neighbor)和近似最近邻查找(Approximate Nearest Neighbor)。其实KDTree就是二叉查找树(Binary Search Tree,BST)的变种。二叉查找树的性质如下:1)若它的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;

张小鱼的博客 2841

KD树学习小结【待补充,数据结构 - KD树】

KD树 难东西,把我学习的先整理一部分,后期再补充 作用 多变量范围查询 k近邻 相关资料 1.《 统计学习方法》,李航,第三章-K近邻算法 很强的KD树模板 2016 ICPC青岛站---k题 Finding Hotels(K-D树) The Closest M Points Finding Hotels 【HDU】2966 In case of failure【KD树】 转载于:ht...

weixin_33736048的博客 115
上一篇: 关于队列的学习
下一篇: 排序算法学习
甘甜的话梅
博客等级 码龄7年 1粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值