04-树6 Complete Binary Search Tree(30 分)

#include      //中序遍历输出搜索二叉树输出为从小到大序列 
#include     //所以我们可以通过中序遍历将排好序的数列赋值给树的每一个结点 
#include     //再通过层次遍历输出即可 
#include
using namespace std;   //完全二叉树可以用数组表示,所以相应的层次遍历则可用顺序输出即可,难点在与将排序好的数组调整为搜索二叉树
                       //网上有的大神用两个数组就搞定了,值得学习,一个排序好的数组A,一个中序遍历产生的数组A的下标的数组B,输出A[B[i]]. 
typedef struct node *BTree;
typedef struct node{
	int data;
	BTree left;
	BTree right;
}*BTree;
int cmp(const void *a,const void *b)
{
	return *(int *)a-*(int *)b;
}

BTree creatInTree(int N)    //创建一个空的拥有n个节点的完全二叉树 
{                           //其实可以完全使用一个数组就可以构建完全二叉树,而且更方便 
	queueq;
	BTree p,BT=NULL,pp;
	int i=0;
	if(N>0){         //根结点 
		BT=(BTree)malloc(sizeof(BTree));
		BT->left=NULL;BT->right=NULL;BT->data=1;   //data=1只是我测试树的创建是否正确 
		q.push(BT);
		i++;
	}
	while(ileft=NULL;p->right=NULL;p->data=1;   
		pp=q.front();
		pp->left=p;
		q.push(p);
		q.pop();
		i++;
		if(ileft=NULL;p->right=NULL;p->data=1;
		    pp->right=p;
		    q.push(p);
		    i++;
		}
	}
	return BT;
}
void traversal(BTree BT,int a[],int *x)    //中序遍历二叉树,并给每个节点赋值 
{
	if(BT){
		traversal(BT->left,a,x);
		BT->data=a[(*x)];(*x)++;
		traversal(BT->right,a,x);
	}
}
/* //用来测试结果 
void PreorderTraversal( BTree BT ) //先序遍历,由裁判实现,细节不表 
{
	if(BT){
		printf("%d ",BT->data);
		PreorderTraversal(BT->left);
		PreorderTraversal(BT->right);
	} 
} 
*/
void Levelordertraversal(BTree BT,int *n)   //层次遍历输出并且释放节点空间 
{
	queueqq;
	BTree p;
	if(BT)qq.push(BT);
	while(!qq.empty()){
		p=qq.front();
		qq.pop();
		printf("%d",p->data);
		(*n)--;
		if(*n)printf(" ");
		if(p->left)qq.push(p->left);
		if(p->right)qq.push(p->right);
		free(p);
	}
}
int main()
{
	int N,i,a[1000],x;
	scanf("%d",&N);
	BTree p,BT=creatInTree(N);              //建空的完全二叉树 
	p=BT;x=0;
	//PreorderTraversal(p);
	//p=BT;
	for(i=0;i
这么做的现实意义并不大,

你可能感兴趣的:(中国大学MOOC-陈越,何钦铭-数据结构-2018春)