您的位置:首页 > 其它

解题报告-PAT-Complete Binary Search Tree

2016-10-18 22:52 330 查看
原题链接:https://pta.patest.cn/pta/test/1342/exam/4/question/20493

浙大oj:1064题

输入题意:输入一组数,根据这组数构造一个二叉排序树而且是完全二叉树。输出这个树的层次遍历序列。

解题思路:

先把输入的序列排序得到num[]数组,然后构造一个普通的n个节点的完全二叉树,节点值可以随意输入,之后利用中序遍历将num[]数组中的值一次填入,利用了二叉排序树的中序遍历序列是递增序列的性质。

源代码:

# include <stdio.h>
# include <algorithm>
# define MAX 1010
using namespace std;

typedef struct Node{
struct Node *l;
struct Node *r;
int data;
}*BiTree,Node;

int num[MAX];
BiTree q[MAX];  //层次遍历队列
int co = 0;  //中序遍历填数标记

//递归中序遍历
void InOrder(BiTree T){
if(T!=NULL){
InOrder(T->l);
T->data = num[co++];
InOrder(T->r);
}
}

/*
解题思路:
先层次遍历构造一个二叉链表存储的完全二叉树
在中序遍历填入相关数据
最后层次遍历输出
*/
int main(){

//预处理
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&num[i]);
}
sort(num,num+n);

//层次遍历建完全二叉树
BiTree p,T;
//初始化根节点
T = (BiTree) malloc(sizeof(Node));
T->data=1;
T->l = T->r = NULL;
int count = 1,front =0,rear = 1;
q[0] = T; //初始化队列
while(count <n && front < rear){
p = q[front++];
if(p->l == NULL){
BiTree temp;
temp = (BiTree)malloc(sizeof(Node));
temp -> l = temp -> r = NULL;
temp -> data = count+1; //数据填入什么都可以,之后还要重新填入
p->l = temp;  q[rear++] = temp;
count++;
if(count >= n) break;
}
if(p->r == NULL){
BiTree temp;
temp = (BiTree)malloc(sizeof(Node));
temp->l = temp->r = NULL;
temp ->data = count+1;
p->r = temp;	q[rear++] = temp;
count++;
if(count >= n) break;
}
}

//中序遍历填入数据
InOrder(T);

//层次遍历输出结果
front = 0;  rear = 1;
q[0] = T;
int flag = 0; //输出格式控制
while(front < rear){
p = q[front++];
if(p-&
4000
gt;l!=NULL)
q[rear++] = p->l;
if(p->r!=NULL)
q[rear++] = p->r;
if(flag)
printf(" ");
flag++;
printf("%d",p->data);
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: