统计一个二叉树的每一层 节点个数
来源:互联网 发布:ubuntu 64位镜像下载 编辑:程序博客网 时间:2024/06/05 06:14
#include<stdio.h>#include<string.h>
#define MAX 100typedef struct TNode{ int data; TNode *left, *right;}TNode;typedef struct QNode{ TNode *tNode; QNode *next; int level;}QNode;typedef struct Queue{ QNode *front; QNode *rear;}Queue;int count[MAX];int level = 0;int InitTree(TNode *&root){ int value; scanf("%d", &value); if(value == 0) root = NULL; else { root = new TNode; if(root == NULL) return -1; root->data = value; InitTree(root->left); InitTree(root->right); } return 0;}int InitQueue(Queue *&qu){ qu = new Queue; if(qu == NULL) return -1; qu->front = qu->rear = new QNode; if(qu->front == NULL) return -1; qu->front->tNode = NULL; qu->front->next = NULL; return 0;}int EnQueue(Queue *&qu, TNode *root, int level){ if(root == NULL) return -1; QNode *node = new QNode; if(node == NULL) return -1; node->next = NULL; node->tNode = root; node->level = level; count[level]++; qu->rear->next = node; qu->rear = node; return 0;}int DeQueue(Queue *&qu, TNode *&tNode, int &level){ if(qu==NULL ||qu->front==qu->rear) return -1; QNode *node = qu->front->next; tNode = node->tNode; level = node->level; qu->front->next = node->next; if(qu->rear == node) qu->rear = qu->front; delete node; return 0;}bool Empty(Queue *&qu) { if(qu->front == qu->rear) return true; else return false;} int LevelVist(TNode *root, Queue *qu){ if(root == NULL) return -1; TNode *tNode; int ret; ret = EnQueue(qu, root, level); if(ret == -1) return -1; while(!Empty(qu)) { ret = DeQueue(qu, tNode, level); if(ret == -1) return -1; if(tNode->left != NULL) EnQueue(qu, tNode->left, level+1); if(tNode->right != NULL) EnQueue(qu, tNode->right, level+1); } return 0;}int main(){ memset(count, 0, 100); TNode *root; Queue *qu; int ret; ret = InitTree(root); if(ret == -1) printf("tree init fail!\n"); ret = InitQueue(qu); if(ret == -1) printf("queue init fail!\n"); ret = LevelVist(root, qu); if(ret == -1) printf("level visit fail!\n"); for(int i=0; i<=level; i++) printf("level:%d %d\n", i, count[i]); return 0;}