03-树2 List Leaves

#include 
#include 

//读取创建树
//使用层序遍历输出叶子结点

#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;iLeft = -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;iLeft == -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的叶子结点就行了,这里队列我使用的是循环队列

你可能感兴趣的:(c,树,数据结构)