#include <stdio.h>
#include <stdlib.h>
//读取创建树
//使用层序遍历输出叶子结点
#define Null -1;
typedef int Tree;
typedef struct TreeNode* TNode;
struct TreeNode {
int Index;
Tree Left;
Tree Right;
};
typedef int Position;
typedef struct QNode * PtrToQNode;
typedef TNode ElementType;
struct QNode{
ElementType * Data; //存储元素的数组
Position Front,Rear; //队列的头尾指针
int MaxSize; //队列的最大容量
};
typedef PtrToQNode Queue;
Queue CreateQueue(int MaxSize){
Queue Q = (Queue)malloc(sizeof(struct QNode));
Q->Data = (ElementType*)malloc(sizeof(ElementType)*MaxSize);
Q->Front = Q->Rear = 0;
Q->MaxSize = MaxSize;
return Q;
};
int IsFull(Queue Q){
return (Q->Rear+1)%Q->MaxSize == Q->Front;
};
int IsEmpty(Queue Q){
return Q->Front == Q->Rear;
};
int AddQ(Queue Q,ElementType X){
if(!IsFull(Q)){
Q->Rear = (Q->Rear + 1) % Q->MaxSize;
Q->Data[Q->Rear] = X;
return 1;
}else{
printf("队列满\n");
return 0;
}
};
ElementType DeleteQ(Queue Q){
if(!IsEmpty(Q)){
Q->Front = (Q->Front + 1) % Q->MaxSize;
return Q->Data[Q->Front];
}else{
printf("队列空");
return NULL;
}
};
//读取并创建一棵二叉树
Tree readTree(ElementType treeArr[],int length){
int flagArr[length];
for(int i=0;i<length;i++){
flagArr[i] = 0;
}
char left,right;
for(int i=0;i<length;i++){
scanf(" %c %c",&left,&right);
TNode node = (TNode)malloc(sizeof(struct TreeNode));
if(left == '-'){
node->Left = -1;
}else{
node->Left = left - '0';
flagArr[node->Left] = 1;
}
if(right == '-'){
node->Right = -1;
}else{
node->Right = right - '0';
flagArr[node->Right] = 1;
}
node->Index = i;
treeArr[i] = node;
}
Tree tree = Null;
for(int i=0;i<length;i++){
if(flagArr[i] == 0){
tree = i;
break;
}
}
return tree;
}
void printLeaves(ElementType treeArr[],Tree T){
if(T != -1){
Queue Q = CreateQueue(100);
AddQ(Q,treeArr[T]);
int flag = 0;
while (!IsEmpty(Q)) {
ElementType tree = DeleteQ(Q);
if(tree->Left == -1 && tree->Right ==-1){
if(!flag){
printf("%d",tree->Index);
flag = 1;
}else{
printf(" %d",tree->Index);
}
}
if(tree->Left != -1){
AddQ(Q,treeArr[tree->Left]);
}
if(tree->Right != -1){
AddQ(Q,treeArr[tree->Right]);
}
}
}
}
int main(){
int length;
scanf("%d\n",&length);
ElementType treeArr[length];
Tree tree = readTree(treeArr,length);
printLeaves(treeArr,tree);
return 0;
};
这道题比较简单,就是创建一棵二叉树,并对树进行层序遍历,然后只输出度为0的叶子结点就行了,这里队列我使用的是循环队列