C语言编程高手请进~~~~~请一定要帮帮忙,万分感谢~~~~~!!!!!!!小虾米自己实在是能力有限,谢谢各位

1.试编写一算法,将两颗二叉树合并成一颗二叉树

2 已知奇偶交换排序算法描述如下:第一趟对所有奇数的i,将a[i]和a[i+1]进行比较;第二趟对所有偶数的i,将a[i]和a[i+1]进行比较,每次比较时若a[i]>a[i+1],则将二者交换;以后重复上述两趟过程,直到整个数组有序。
(1)试问排序结束的条件是什么?
(2)编写程序实现这一算法。

第1题题目表述不清,普通的二叉树的合并没有任何意义,如果是二叉排序树还差不多。若非要进行普通的二叉树的合并,只要将一个树的插入到另一个树的度非2的结点上,最简便的做法是沿着另一个树的根一直遍历到左子树的叶子结点,不过这没有意义。要是这样的话,此题太简单了,自己实现吧!!
第2题
(1)排序结束的最基本即最保守的条件是:进行n次奇偶交换操作。
还有一个是针对本来就基本有序的情况,如果在n次循环中,有两次没有交换操作,则停止排序,因为此时必有序!
故综合起来为:当有两次没有交换操作或进行了n次奇偶交换时,排序结束。
(2)源代码
#include<iostream>
#include<string>
using namespace std;

void OddEvenSort(int* p,const int& size)
{
int k=-1;
for(int i=0;i<size;++i)
{
int j=i%2;
for(;j<size;j+=2)
if(j+1<size&&p[j]>p[j+1])
{
++k;
p[j]=p[j+1]^p[j] , p[j+1]=p[j]^p[j+1] , p[j]=p[j+1]^p[j] ;//交换
}
if(i-k==2)
break;//两次没有交换,排序停止
}
}

void PrintArray(int* p,const int& size)
{
for(int i=0;i<size;++i)
{
cout<<p[i]<<'\t';
if((i+1)%8==0)
cout<<endl;
}
cout<<endl;
}
void main()
{
int size=0;
int *p=0;
cout<<"Enter the size of an array!"<<endl;
cin>>size;
p=new int[size];
cout<<"Please input the elements!"<<endl;
for(int i=0;i<size;++i)
cin>>p[i];
OddEvenSort(p,size);
cout<<"After the sortion,the array is:"<<endl;
PrintArray(p,size);
delete[] p;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-11-01
1 找到A的底层的指针Rnext或Lnext把B的头指针headb赋给Rnext或Lnext,
unitab(struct heada,struct headb)
{
while(*heada->Rnext)heada = Rnext;//加入右叉
heada->Rnext = headb;
}

2,结束条件是不再有交换发生。。标志um

void pxu(int a[])
{
int temp;
int um = 1;//交换标志
while(um){
um = 0;
for(int i=0;(i*2+2)<N;i++)//N数组的长度
{
if(a[i*2+1]>a[i*2+2])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
um = 1;
}
}
for(int i=0;(i*2+1)<N;i++)
{
if(a[i*2]>a[i*2+1])
{
temp=a[i];
a[i]=a[i+1];
a[i+1]=temp;
um = 1;
}
}
}
}

参考资料:C程序设计

本回答被提问者采纳
相似回答