⑴ 二叉树查找树算法实现
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
typedef int ElemType;
typedef int Status;
typedef struct TElemType{
int key;
int num;
}TElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
Status SearchBST(BiTree T,int key,BiTree f,BiTree &p){
if(!T) { p=f; return ERROR;}
else if(EQ(T->data.key,key)) { p=T; return OK; }
else if(LT(key,T->data.key))
return SearchBST(T->lchild,key,T,p);
else return SearchBST(T->rchild,key,T,p);
}
Status SearchBST1(BiTree T,int key,BiTree f,BiTree &p){
if(!T) { p=f; return ERROR;}
else if(EQ(T->data.key,key)) {
printf("%d %d",p->data.key,p->data.num);
p=T; return OK; }
else if(LT(key,T->data.key))
return SearchBST(T->lchild,key,T,p);
else return SearchBST(T->rchild,key,T,p);
}
Status InsertBST(BiTree &T,TElemType e){
BiTree s,p;
if(!SearchBST(T,e.key,NULL,p)){
s=(BiTree)malloc(sizeof(BiTNode));
s->data=e;
s->lchild=s->rchild=NULL;
if(!p) T=s;
else if(LT(e.key,p->data.key)) p->lchild=s;
else p->rchild=s;
return OK;
}
}
Status Output(TElemType e){
printf("%d ",e.key);
printf("%d\n",e.num);
}
Status PreOrderTraver( BiTree T){//二叉树先序遍历
if(T==NULL) return ERROR;
else{
Output(T->data);
PreOrderTraver(T->lchild);
PreOrderTraver(T->rchild);}
return OK;
}
int main()
{
BiTree T,f=NULL,q;
TElemType a;
int i,n,b;
printf("请输入你要创建的二叉排序树的结点个数:\n");
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",a.key);
scanf("%d",a.num);
InsertBST(T,a);
}
printf("请输入你要查找的关键字: ");{
scanf("%d",b);
if(SearchBST1(T,b,f,q)) printf("查找成功!\n");
else printf("查找失败!\n");}
printf("二叉树的先序遍历:\n");
PreOrderTraver(T);
system("pause");
return 0;
}
这个就是!希望可以帮助你!
⑵ 树和森林生成二叉树算法(请给出数据结构)
这个实现起来蛮简单的,就是一个根节点的第一个孩子就是他的左孩子,第二个孩子就是他第一个孩子的有孩子,第三个孩子就是他第二个孩子的右孩子。每个节点的第一个孩子是自己的左孩子。等有时间再帮你编这个程序。
⑶ 生成树算法
“生成树”资料
交换机内的生成树算法(STA)使你可以创建一条备用链路(当网络中存在多台交换机时)。在主链路正常工作时,备用链路处于空闲状态(不工作);只有在主链路出现问题时,备用链路才不需要任何人工干预自动地接替主链路。
这种自动重构的功能,使得网络上的用户能够最大限度地与网络保持正常的连接。生成树算法较复杂,所以,建议最好在充分研究理解其之后,再更改其一些设置。请仔细阅读并理解下述内容之后,再去更改交换机上的生成树的默认设置。
网络环路的侦测和预防(Network loop detection and prevention):任何两个局域网之间应该只有一条路径,否则,网络中将出现环路。如果存在着多于一条的路径,那么生成树算法将会侦测到环路的发生,并自动选择开销值(c ost)最低的那条路径作为可使用的路径(主链路),而阻断其它路径,将它们作为备用路径(备用链路)。
自动拓扑重构(Automatic topology re-configuration):当主链路出现故障时,生成树算法将自动启用备用链路,重构网络结构。
生成树的级别(STA Operation Levels)
生成树有两种工作级别:桥级别(bridge level)和端口级别(port level)。在桥一级上,生成树算法为每台交换机计算桥的标志级数(Bridge Identifier),然后设定根桥(Root Bridge)和指定桥(Designated Bridges)。而在端口一级上,生成树算法设定根端口(Root Port)和指定端口(Designated Ports)。详述如下:
在桥一级上(On the Bridge Level):
根桥(Root Bridge):具有最小桥标志级数的(lowest Bridge Identifier)交换机是根桥(Root Bridge)。当然,你希望根桥是环路中所有交换机当中最好的一台(交换机),以保证能够提供最好的网络性能和可靠性。
桥标志级数(Bridge Identifier):桥标志级数是桥的优先级(Bridge Priority)和交换机的MAC地址的综合数值,其中桥的优先级(Bridge Priority)是一个你可以设定的参数。例如,“4 00 80 C8 00 01 00”中的“4”是桥的优先级,“00 80 C8 00 01 00”是交换机的MAC地址。交换机的桥标志级数越低,则交换机的优先级越高,这样可以增加其成为根桥的可能性。
指定桥(Designated Bridge):在每个网段中,到根桥(Root Bridge)的路径开销最低的(lowest Root Path Cost)桥将成为指定桥(Designated Bridge),数据包将通过它转发到网段。一旦所有的交换机具有相同的根路径开销(Root Path Cost),那么具有最低的桥标志级数的(lowest Bridge Identifier)交换机才会被定为指定桥(De signated Bridge)。
根路径开销(Root Path Cost):一台交换机的根路径开销(Root Path Cost)是根端口(Root Port)的路径开销(Path Cost)与数据包经过的所有交换机的根路径开销(Root Path Cost)之和。根桥(Root Bridge)的根路径开销(Root Path Cost)是零。
桥的优先级(Bridge Priority):是一个用户可以设定的参数。设定的值越小,优先级越高。交换机具有越高的优先级,才越有可能成为根桥。
在端口一级上(On the Port Level):
根端口(Root Port):每台交换机都有一个根端口(Root Port),这个端口到根桥的路径开销最低。一旦多个端口具有相同的到根桥的路径开销时,那么具有最低的端口标志级别的才会成为根端口。
指定端口(Designated Port):指定端口就是指定桥(Designated Bridge)上的端口。
端口优先级(Port Priority):数值越小,端口的优先级就越高。具有越高端口优先级,才越有可能成为根端口。
路径开销(Path Cost):这是一个可变的参数,它将随着生成树中的设定值的变化而变化。依据STA的默认参数值,每个1000Mbps网段有一个指定的路径开销值为4 ,100Mbps网段的路径开销值19,10Mbps网段的路径开销值100.
生成树参数(STA Parameters)
生成树的参数用户可以根据自己的需要进行修改,但是建议最好使用出厂时的默认设置。除非确实需要对出厂设置值进行变动时,再去改动默认值。用户可以改动的生成树参数有如下几个:
桥优先级(Bridge Priority):数值范围从0到65535.“0”的优先级最高。
呼叫时间(Bridge Hello Time):数值范围从1秒到10秒。是指根桥向其它所有交换机发出BPDU数据包的时间间隔,以告知其它所有交换机它是根桥。如果你的交换机还未是根桥时为其设置了呼叫时间,那么,一旦你的交换机成为根桥,该呼叫时间就会派上用处。
注意:呼叫时间不能大于桥的最大老化时间(Max. Age),否则,将出现错误信息。
最大的桥老化时间(Bridge Max. Age):数值范围从6秒到40秒。如果在超出最大老化时间之后,还没有收到根桥发出的BPDU数据包,那么,在允许的条件下你的交换机将充当根桥向其它所有的交换机发出B PDU数据包。如果交换机确实具有最小的桥标志级数,那么,它将随之成为根桥。
桥转发时延(Bridge Forward Delay):数值范围从4秒到30秒。是指交换机的端口从阻塞状态转为转发状态所用的监听时间。
当你欲变动生成树参数时,请一定记住下述公式:
最大的桥老化时间≤ 2 x(桥转发时延 – 1秒)
即:Max. Age ≤ 2 x (Forward Delay - 1 second)
最大的桥老化时间≥ 2 x(呼叫时间 + 1秒)
即:Max. Age ≥ 2 x (Hello Time + 1 second)
端口优先级(Port Priority):数值范围从0到255.数值越小,那么该端口越可能成为根端口。
⑷ 二叉树算法如何学习
理解是关键,多看书,有条件上机,对理解有帮助,慢慢就会了!!!
加油啊!!!
⑸ 简单介绍树回归的算法原理
简单介绍树回归的算法原理
线性回归方法可以有效的拟合所有样本点(局部加权线性回归除外)。当数据拥有众多特征并且特征之间关系十分复杂时,构建全局模型的想法一个是困难一个是笨拙。此外,实际中很多问题为非线性的,例如常见到的分段函数,不可能用全局线性模型来进行拟合。
树回归将数据集切分成多份易建模的数据,然后利用线性回归进行建模和拟合。
构建回归树算法伪代码:
寻找当前最佳待切特征和特征值并返回
如果当前最佳特征没有找到,不可切分,则把当前结点的数据均值作为叶节点
否则用最佳特征和特征值构建当前结点
切分后的左右节点分别递归以上算法
寻找最佳特征算法伪代码:
如果该数据集的特征值只有一种,不可切分,返回当前结点的数据均值作为特征值
否则重复一下步骤直到找到最小总方差
遍历每一列
遍历每列的值
用该值切分数据
计算总方差
如果总方差差值小于最初设定的阈值,不可切分
如果左右样本数小于最初设定的阈值,不可切分
否则返回最佳特征和最佳特征值。
需要输入的参数有:数据集,叶节点模型函数(均值),误差估计函数(总方差),允许的总方差最小下降值,节点最小样本数。
⑹ 最优二叉树算法的介绍
衡量一个算法的优劣有许多因素,效率就是其中之一。而效率指的就是算法的执行时间。提高效率是软件开发必须注重的问题。对同一个问题往往有多个算法可以解决,在同等条件下,执行时间短的算法其效率是最高的。从霍夫曼树的定义以及霍夫曼算法出发,介绍如何构造霍夫曼树以及利用霍夫曼算法优化程序设计的原理,重点讨论在判定类问题中利用霍夫曼树可以建立最佳判定算法,提高程序的执行速度。
⑺ 交换二叉树的所有节点的左右子树算法(C语言)
#include<stdio.h>
#include<malloc.h>
typedef struct binode{
int data;
struct binode *lchild,*rchild;
}binode,*bitree;
typedef struct{
bitree elem[100];
int top;
}stack;
bitree creat_bt(){ //按扩展前序建二叉树
bitree t;int x;
scanf("%d",&x);
if (x==0) t=NULL;
else { t=(bitree)malloc(sizeof(binode));
t->data=x;
t->lchild=creat_bt();
t->rchild=creat_bt();
}
return t;
}
void exchange(bitree t) //左、右子树交换
{bitree p;
if(t!=NULL)
{ p=t->lchild;t->lchild=t->rchild;
t->rchild=p;
exchange(t->lchild);
exchange(t->rchild);
}
}
void inorder(bitree bt) //递归的中序遍历
{ if (bt){
inorder(bt->lchild);
printf("% d",bt->data);
inorder(bt->rchild);
}
}
main()
{bitree root;
printf("\n");
printf("建二叉树,输入元素:");
root=creat_bt(); /*create tree of useing preorder*/
printf("交换前的中序序列是:");
inorder(root);
exchange(root);
printf("\n交换后的中序序列是:");
inorder(root);
printf("\n");
}
⑻ 数据结构与算法 二叉树交换左右子树算法
原来节点结构体:
typedef struct
{
Element X;
Node* pLeft;
Node* pRight;
}Node;
现在从新定义一个结构
typedef struct
{
Element X;
NewNode* pRight;
NewNode* pLeft;
}NewNode;
然后用新树的根指向原树的根
Node* pOldTree; 老树
NewNode* pNewTree = (NewNode*)pOldTree;
这样省的交换了,省事吧 -_,-
⑼ 二叉树 算法
原因就在于Status CreatBitTree(BitTree e) 这个函数的参数BitTree e,既然e是参数,因此你在函数体内用e=NULL; 及e=(BitTree)malloc(sizeof(BitNode)); 来给e赋值都是没有用的,赋值不会返回给调用处。修改的话改成引用就可以了。也就是把Status CreatBitTree(BitTree e) 这一行改成Status CreatBitTree(BitTree &e) 就行了。
还有:二叉树算法递归中序输入是abc##de#g##f### (你这应该是前序输入吧?)
⑽ 二叉树算法是什么
二叉树是每个节点最多有两个子树的有序树。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
性质
1、在二叉树中,第i层的结点总数不超过2^(i-1)。
2、深度为h的二叉树最多有2^h-1个结点(h>=1),最少有h个结点。
3、对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1。