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];
}
}