题目
对于给定的二叉树,本题要求你按从上到下、从左到右的顺序输出其所有叶节点。
代码
#include<stdio.h>
#include<stdlib.h>
#define N 10
typedef struct Tree{
int data;
int lchild,rchild;
}*BiTree;
typedef struct queue{
int data[N];
int front,rear;
}*Queue;
int CreatTree(int n);
Queue CreatQueue(Queue q);
void Enqueue(Queue q,int x);
int Dequeue(Queue q);
int Empty(Queue q);
void LevelSearch(int root);
BiTree T;
Queue que;
int count[N];
void main(){
int n,i,root;
scanf("%d",&n);
getchar();
//初始化count数组
for(i=0;i<n;i++)
count[i]=0;
root=CreatTree(n);
printf("root=%d \n",root);
printf("创建树内各个点的值\n");
for(i=0;i<n;i++){
printf("%d data=%d left=%d right=%d\n",i,T[i].data,T[i].lchild,T[i].rchild);
}
printf("叶子结点序列为:");
LevelSearch(root);
system("pause");
}
int CreatTree(int n){
int index=0,i;
char left,right;
T=(BiTree)malloc(sizeof(struct Tree)*N);
while(index<n){
scanf("%c %c",&left,&right);
getchar();
printf("left=%c right=%c\n",left,right);
if( left == '-' ){
printf("进入left判断\n");
T[index].data=index;
T[index].lchild=-1;
}
else{
printf("进入left的else判断\n");
T[index].data=index;
printf("left=%d\n",left-'0');
T[index].lchild= left - '0';
count[left-'0']++;
}
if(right=='-'){
printf("进入right判断\n");
T[index].rchild=-1;
}
else{
printf("进入right的else判断\n");
printf("right=%d\n",right-'0');
T[index].rchild= right - '0';
T[index].rchild=right-'0';
count[right-'0']++;
}
index++;
}
for(i=0;i<n;i++)
if(!count[i])
return i;
return -1;
}
void LevelSearch(int root){
int k;
que=CreatQueue(que);
Enqueue(que,root);
while(!Empty(que)){
k=Dequeue(que);
if(T[k].lchild==-1 && T[k].rchild==-1)
printf("%d ",T[k].data);
if(T[k].lchild!=-1)
Enqueue(que,T[k].lchild);
if(T[k].rchild!=-1)
Enqueue(que,T[k].rchild);
}
}
Queue CreatQueue(Queue q){
q=(Queue)malloc(sizeof(struct queue));
q->front=q->rear=0;
return q;
}
void Enqueue(Queue q,int x){
q->data[q->rear]=x;
q->rear=(q->rear+1)%N;
}
int Dequeue(Queue q){
int temp;
temp=q->data[q->front];
q->front=(q->front+1)%N;
return temp;
}
int Empty(Queue q){
if(q->front==q->rear)
return 1;
else
return 0;
}
总结
这个题一言难尽,调了好久,就因为当时创建树时的左子树、右子树节点创建的那俩个if操作使用了c v操作,导致右子树中的某些节点赋值忘记改了,仍然是对左子树赋值 (c v需谨慎啊!) ,以上代码附带了完整的调试代码,不理解的小伙伴可以参考调试注解。