统计一个二叉树的每一层 节点个数
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; }
相关文章推荐
- 统计一个二叉树的每一层 节点个数(队列,递归)
- 给定一个二叉树和任意一个节点,求该该节点的下一层的第一个节点
- 设计一个算法,求非空二叉树b的宽度(即具有节点最多的那一层的节点个数)
- 给定一个二叉树和任意一个节点,求该该节点的下一层的第一个节点
- 二叉树查找不严格小于一个值的最大值(返回节点)。
- 给定一颗二叉树,以及其中的两个node(地址均非空),要求给出这两个node的一个公共父节点,使得这个父节点与两个节点的路径之和最小。
- [阿里巴巴2015校园招聘]写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树中相差最大的两个节点间的差值绝对值。请注意程序效率。 .
- 设计一个算法,求非空二叉树中指定的第k层(k>1)的叶子节点的个数
- 淘宝笔试题:一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶结点所经过的结点形成一条路径。
- 二叉树的操作之统计二叉树中节点的个数
- 在二叉树中找到一个节点的后继节点
- 只使用指向二叉树的根的一个指针T,计算T中节点的个数,T中树叶的片数,T中满节点的个数
- 给定一个二叉树,节点值为0-9,从根节点到叶子结点组成一个数,求二叉树所有组成的数的和
- 求一个二叉树中任意两个节点间的最大距离
- 2个二叉树A、B,树的每个节点上都有一个整数值。如何判断A与B是否其中一个是另一个的子树?
- 51. 腾讯面试题:一个二叉树,中序遍历,找一个节点的后一个节点
- day14之判断一个节点是否在一棵二叉树中+判断一颗二叉树是是否是另一颗树的子树
- 给定一个二叉树,从左到右,找出第 k 个叶子节点 [# 65]