首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

堆排序相干

2012-09-10 
堆排序相关(1)假设如图的程序生成如图的树,c语言使用递归 编写个函数填在A处。http://my.csdn.net/my/album

堆排序相关
(1)假设如图的程序生成如图的树,c语言使用递归 编写个函数填在A处。http://my.csdn.net/my/album/detail/1225725#
http://my.csdn.net/my/album/detail/1225727
(2)改变数组a的初始值,画出这个程序生成的树。
(3)函数func返回数组a的值降序排列的首地址,在A处写出适当的程序。

[解决办法]
#include<stdio.h>
#include<stdlib.h>

struct data{
int key;
struct data*left,*right;

};

struct data*func(int x,struct data *p);
void travelTree(data * p);
int a[]={4,6,2,3,5,7,1,-1};

int main(void)
{
struct data *p,*p1;
int i=0;
p= NULL;
while( a[i++]!= -1 )
{

p = func( a[i-1],p );//分析此处的while循环,因为蛋疼的每次插入节点都调用一次func并且还是用的上次的p,故得出结论,此处的p永远是整棵树的根节点,即节点“4”

}
  

travelTree(p);
  
return 0;
}

struct data *func( int x, struct data *p )//func的返回值就是p本身,即递归进入时的根节点
{
if(p==NULL)//因为首节点没有创建,必须有这一步,导致我的递归函数写的很冗余,func外面创建了首节点会爽很多
{

p=(struct data*)malloc(sizeof(struct data));
p->key=x;
p->left=p->right=NULL;
return p;
}
if(x<=p->key)//比根节点小,加到左子树
{
if(p->left==NULL)
{
p->left=(struct data*)malloc(sizeof(struct data));
p->left->key=x;
p->left->left=p->left->right=NULL;

}
else func(x,p->left);
return p;
}
else //比根节点大,加到右子树
{
if(p->right==NULL)
{
p->right=(struct data*)malloc(sizeof(struct data));
p->right->key=x;
p->right->left=p->right->right=NULL;
}
else func(x,p->right);
return p;
}

}



void travelTree(data * p)//先根遍历输出结果
{
if(p!=NULL)
{
printf("%d ",p->key);
travelTree(p->left);
travelTree(p->right);
}
}



热点排行