21 软学

1.有一个完全二叉树的遍历结果用数组顺序存放,要求以非递归算法,实现树的先根遍历,要求时间复杂度为O(n)。

void PreOrder(Tree t)
{
	if(t!=NULL)
	{
		Tree q,stack[maxsize];
		int top=-1;
		stack[++top]=t;
		int visit[maxsize],k=0;
		while(top!=-1)
		{
			q=stack[top];
			top--;
			visit[k++]=q->key;
			if(q->right!=NULL) //因为栈是后进先出,且访问顺序是根左右,左先访问,所以左后入栈
				stack[++top]=q->right;
			if(q->left!=NULL)
				stack[++top]=q->left;
		}
	}
}

2.有一个存放了一些数据的单链表,其中head是头指针,key域用来存放整数,要求将单链表的数据按正数在负数前面进行排列。

int Node_Length(node *head) //链表长度
{
	if(head==NULL)
		return 0;
	node *p;
	p=head;
	int n=0;
	while(p!=NULL)
	{
		n++;
		p=p->next;
	}
	return n;
}
void Sort(node *head)//冒泡排序交换结点的值
{
	node *p;
	int temp;
	int n=Node_Length(head);//链表长度
	int i,j;
	for(i=0;i<n-1;i++)
	{
		p=head;
		for(j=0;j<n-1-i;j++)
		{
			if(p->key<0&&p->next->key>0)
			{
				temp=p->key;
				p->key=p->next->key;
				p->next->key=temp;
			}
			p=p->next;
		}
	}
}

3.求最大生成树

typedef struct graph
{
	int ver[maxsize];
	int edges[maxsize][maxsize];
	int vernum,edgesnum;
}MGraph;
//用prim算法求最大生成树,换成找权值最大的边就行了,把没有路径的边改为无穷小
void Prim_Max(MGraph G,int v0)
{
	int maxcost[maxsize],visit[maxsize],v;
	int i,j,k,max;
	v=v0;
	for(i=0;i<G.vernum;i++)  //将无穷路径设为无穷小
		for(j=0;j<G.vernum;j++)
			if(G.edges[i][j]==maxWeight)
			{
				G.edges[i][j]=-1;
			}
	for(i=0;i<G.vernum;i++) //初始化
	{
		maxcost[i]=G.edges[v0][i];
		visit[i]=0;
	}
	visit[v0]=1;
	for(i=0;i<G.vernum-1;i++)
	{
		max=0;
		for(j=0;j<G.vernum;j++)  //选出候选边中最大的
		{
			if(visit[j]==0&&maxcost[j]>max)
			{
				max=maxcost[j];
				k=j;
			}
		}
		visit[k]=1;
		v=k;
		printf("点%d ",v);
		for(j=0;j<G.vernum;j++)//更新候选边
			if(visit[j]==0&&G.edges[v][j]>maxcost[j])
				maxcost[j]=G.edges[v][j];
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值