PTA练习题
对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。
输入格式:
首先第一行给出一个正整数 N(≤10),为树中结点总数。树中的结点从 0 到 N−1 编号。随后 N 行,每行给出一个对应结点左右孩子的编号。如果某个孩子不存在,则在对应位置给出 “-”。编号间以 1 个空格分隔。
输出格式:
在一行中按规定顺序输出叶节点的编号。编号间以 1 个空格分隔,行首尾不得有多余空格。
这题难在如何把静态树放入动态队列和入队条件,需要用编译器慢慢调试找错;
#include<stdio.h>
#include<stdlib.h>
struct tree{
int left;
int right;
}T[10];
int check[11]={0};
typedef struct Node *Queue;
struct Node{
int data;
int left;
int right;
struct Node *next;
};
int Bintree(struct tree T[]);
Queue print(Queue q);
int main(){
int k;
Queue q;
q=(Queue)malloc(sizeof(struct Node));
q->next=NULL;
k=Bintree(T);
q->data=k;
q->left=T[k].left;
q->right=T[k].right;
print(q);
return 0;
}
int Bintree(struct tree T[]){
//建立静态树,返回根的值
int n,i;
char cl,cr,ch;
scanf("%d",&n);
scanf("%c",&ch);
if(n>0){
for(i=0;i<n;i++){
scanf("%c %c",&cl,&cr);
scanf("%c",&ch);
if(cl!='-'){
T[i].left=cl-'0';
check[T[i].left]=1;
}
else T[i].left=-1;
if(cr!='-'){
T[i].right=cr-'0';
check[T[i].right]=1;
}
else T[i].right=-1;
}
for(i=0;i<n;i++)
if(check[i]==0) break;
}
return i;
}
Queue print(Queue q){
//建立队列,筛选并输出叶节点
Queue head,tail;
head=tail=q;
int z=0;
while(head){
Queue p;
p=(Queue)malloc(sizeof(struct Node));
p->next=NULL;
if(head->left!=0||head->right!=0){
Queue a,b;
a=(Queue)malloc(sizeof(struct Node));
b=(Queue)malloc(sizeof(struct Node));
a->next=NULL;
b->next=NULL;
a->data=head->left;
a->left=T[head->left].left;
a->right=T[head->left].right;
b->data=head->right;
b->left=T[head->right].left;
b->right=T[head->right].right;
a->next=b;
tail->next=a;
tail=b;
}
p=head;
head=head->next;
if(p->left==-1&&p->right==-1){
if(z==0){
printf("%d",p->data);
z++;
}
else printf(" %d",p->data);
}
free(p);
}
}
花了很长时间调试找错*-*…