PAT程序设计考题——甲级1004 遍历树节点(计算树每层的叶子节点数目)
来源:互联网 发布:火炬之光mac版汉化教 编辑:程序博客网 时间:2024/06/01 10:02
试题链接如下:点击打开链接
试题要求翻译如下:
程序输入:第一行输入为树总节点个数N(<100)、非叶子节点个数M,用空格分隔;随后输入M行,每行的格式如下:ID K ID[1] ID[2]...ID[K]
第一个ID代表一个非叶子节点的两位数序号,不满两位用0填充,K代表该节点的子节点数目,随后的K个ID表示子节点的两位数序号。现定root根节点ID是01。
程序输出:算出树每层中叶子节点个数,从根节点所在层开始,逐渐向下层,用空格分隔。
例子:
input:
2 1
01 1 02
output:
0 1
代码设计如下:
#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct TreeNode {charvalue;TreeNode**childList;intchildCapacity;intchildNumber;TreeNode( char value ){childNumber = 0;childCapacity = 5;this->value = value;childList = (TreeNode**)malloc(childCapacity*sizeof(TreeNode*));}~TreeNode(){free(childList);childList = NULL;}voidSetNodeValue( char value ){this->value = value;}voidSetNodeList( TreeNode** list ){childList = list;}charGetNodeValue(){return this->value;}TreeNode**GetNodeList(){return childList;}TreeNode*GetNodeListItem(int index){return childList[index];}intAddChild( TreeNode* node ){if ( childNumber == childCapacity ){TreeNode**old = childList;childList = (TreeNode**)realloc( childList, 2*sizeof(TreeNode*)*childCapacity );if ( childList == NULL ){childList = old;return false;}childCapacity = 2*childCapacity;}childList[childNumber++] = node;return true;}}TREE_NODE,*PTREE_NODE;typedef struct LevelInfo {int* number;int size;int capacity;LevelInfo(){size = 0;capacity = 5;number = (int*)malloc(capacity*sizeof(int));for ( int i = 0; i < capacity; i++ ){number[i] = 0;}}~LevelInfo(){free(number);}void SetLevelCapacity( int count ){if ( capacity < count ){int* old = number;number = (int*)realloc( number, capacity*2 );if ( number == NULL ){number = old;return;}for ( int i = capacity; i < 2*capacity; i++ ){number[i] = 0;}capacity *= 2;}}void SetLevelSize( int level, int number ){this->number[level] = number;if ( level > size )size = level;}int GetLevelSize( int level ){return number[level];}void ResetAnaly(){for ( int i = 0; i < capacity; i++ ){number[i] = 0;}size = 0;}}LEVEL_INFO,*PLEVELINFO;class CTreeLevelAnaly{public:CTreeLevelAnaly(){InitTree();}~CTreeLevelAnaly(){UninitTree(m_pTreeRoot);delete m_pTreeRoot;}int InitTree(){printf( "Please input the number of node and non-leaf node:\n");scanf( "%d %d", &m_iAllNodeCount, &m_iNonLeafNodeCount );TreeNode** tempList = (TreeNode**)malloc( m_iAllNodeCount*sizeof(TreeNode*) );for ( int i = 0; i < m_iAllNodeCount; i++ ){TreeNode* pNode = new TreeNode( (i+1) );tempList[i] = pNode;}printf( "Please input %d lines describe the parent and chidren\n", m_iNonLeafNodeCount );for ( int k = 0; k < m_iNonLeafNodeCount; k++ ){char* dot = NULL;char buffer[100] = {0};int* list = (int*)malloc( 100*sizeof(int) );int used = 0;printf( "the %d line:\n", k+1 );getchar();scanf( "%[^\n]", buffer );dot = strtok( buffer, " " );while ( dot != NULL ){list[used++] = atoi(dot);dot = strtok( NULL, " ");}list[used] = -1;for ( int j = 2; j < used; j++ ){int index = list[j];int pos = list[0];tempList[ pos - 1 ]->AddChild( tempList[ index - 1 ] );}}m_pTreeRoot = tempList[0];free(tempList);return 0;}voidUninitTree( TreeNode* node ){for (int i = 0; i < node->childNumber; i++ ){UninitTree( node->childList[i] );delete node->childList[i];}}TreeNode*GetRootNode(){return m_pTreeRoot;}int PrintLevelAnaly(){int size = m_kLevelCount.size;for ( int i = 0; i <= size; i++ ){printf("Level %d has %d Leaf-Node\n", i, m_kLevelCount.number[i] );}return false;}// 深度优先,递归 intdfsRecursiveLevelCount( TreeNode* node, int level ){printf("visiting: value:%c;level:%d\n", node->value, level );m_kLevelCount.SetLevelCapacity(level);// 筛选非叶子节点if ( node->childNumber == 0 ){int temp = m_kLevelCount.GetLevelSize( level );if ( temp == 0 ){temp = 1;}else{temp++;}m_kLevelCount.SetLevelSize( level, temp );}for (int i = 0; i < node->childNumber; i++ ){dfsRecursiveLevelCount( node->childList[i], level + 1 );}return 0;}protected:private:TreeNode*m_pTreeRoot;LevelInfom_kLevelCount;intm_iAllNodeCount;intm_iNonLeafNodeCount;};int main(){CTreeLevelAnaly* tree = new CTreeLevelAnaly;printf("-----------深度优先,递归------------\n");tree->dfsRecursiveLevelCount( tree->GetRootNode(), 0 );tree->PrintLevelAnaly();delete tree;printf("\n");return 0;}
1 0
- PAT程序设计考题——甲级1004 遍历树节点(计算树每层的叶子节点数目)
- [PAT甲级]1004. Counting Leaves (30)(求树各层非叶子节点数目)
- 求二叉树的叶子节点数目
- PAT程序设计考题——甲级1009(计算两个多项式相乘的积)
- 求满二叉树(哈夫曼树)叶子节点和非叶子节点的数目
- 二叉树叶子节点的数目&二叉树第k层节点的数目&二叉树第k层叶子节点的数目
- 基本数据结构——二叉树的建立,遍历,求叶子节点,深度计算
- Leetcode637. BFS计算二叉树每层节点的平均值
- PAT程序设计考题——甲级1008(Elevator电梯时间计算问题)
- 数据结构——二叉树遍历、深度、叶子节点数计算
- 计算二叉树的高度、节点数、叶子节点数
- 二叉树的前、中、后序遍历(递归和非递归)、层序遍历、深度、叶子节点个数
- 网易——求二叉树最大叶子节点到最小叶子节点的距离
- 求二叉树的节点个数、叶子节点个数、第k层的节点个数
- 二叉树第k层的叶子节点数
- 二叉树的创建、遍历、深度、叶子节点个数
- 二叉树的创建、遍历、深度、叶子节点数
- 二叉树的遍历 深度 与叶子节点
- 最近心得
- SQL Server IP地址格式转换(GUID To String)
- 最近的一点感想
- java生成二维码
- 用Sklearn做判别测试
- PAT程序设计考题——甲级1004 遍历树节点(计算树每层的叶子节点数目)
- JAVA读取propertise文件内容两种方式
- 随时随地退出程序
- IOSMKMapView地图视图 详解
- CentOS 7 开机加载内核模块
- (三)如何自己动手实现 KVO,KVO的实现原理
- android studio系列之使用指南
- php final
- 如何分辨彩色图与灰度图