您的位置:首页 > 其它

统计一个二叉树的每一层 节点个数

2013-03-14 00:06 127 查看
#include<stdio.h>
#include<string.h>
#define MAX 100
typedef 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐