原题链接:http://acm.pku.edu.cn/JudgeOnline/problem?id=2418
解法:二叉排序树存储每一个树种,然后中序遍历输出结果即可
代码(c语言):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXSIZE 10001
//二叉查找树,中序输出
int root=0;//根索引,0表示NULL
int curr_size=0;//当前树中结点的个数
int num_trees=0;//树的数目
//树节点的定义,下标从1开始,0表示NULL
char key[MAXSIZE][31];
int value[MAXSIZE];
int left_child[MAXSIZE];
int right_child[MAXSIZE];
//查找二叉排序树,如果树为空,返回0,号码已经存在(计数器加1),返回-1,否则返回最后查找的位置
int search(int node, char* k)
{
int parent=0;
int current=node;
while(current!=0)
{
parent=current;
int tmp = strcmp(key[current],k);
if(tmp == 0)
{
value[current]++;
return -1;
}else if(tmp<0)
{
current = right_child[current];
}else
{
current = left_child[current];
}
}
return parent;
}
//插入新节点
int insert(int node,char* k)
{
//判断一下插在左子树,还是右子树
int tmp = strcmp(key[node],k);
if(tmp==0)
return 0;
int new_node = ++curr_size;//分配新位置
strcpy(key[new_node],k);
value[new_node]=1;
left_child[new_node]=0;
right_child[new_node]=0;
if(new_node==1)//树为空
root = 1;
if(tmp>0)
left_child[node] = new_node;
else
right_child[node] = new_node;
return 1;
}
void build_tree()
{
//freopen("in.txt","r",stdin);
char buf[31];
while(gets(buf))
{
num_trees++;
int index = search(root,buf);
if(index>=0)
{
insert(index,buf);
}
}
}
//中序遍历
void inorder_tree(int root)
{
if(!root)
return ;
inorder_tree(left_child[root]);
printf("%s %.4f\n",key[root] ,value[root]*100.0/num_trees);
inorder_tree(right_child[root]);
}
int main()
{
build_tree();
inorder_tree(root);
return 0;
}
分享到:
相关推荐
二叉排序树,又称二叉查找树或二叉搜索树,是一种特殊的二叉树数据结构,它具有以下特性:对于树中的每个节点,其左子树中的所有节点的值都小于该节点的值,而右子树中的所有节点的值都大于该节点的值。这种性质使得...
pku acm 2418 Hardwood Species代码,使用二叉查找数(BST),有详细的注释 解题报告请访问:http://blog.csdn.net/china8848
pku acm 2503 Babelfish代码 二叉查找树
pku acm 2371 Questions and answers代码 采用二叉查找树排序,解题报告请访问:http://blog.csdn.net/china8848
pku acm 2075 Tangled in Cables 代码 二叉查找树 prim算法,//解题报告请访问:http://blog.csdn.net/china8848
題目: http://acm.pku.edu.cn/JudgeOnline/problem?id=2418
【标题】"pku.zip_PKU" 指的是一份与北京大学(Peking University, PKU)相关的压缩文件。从描述来看,这份压缩包包含了部分编程题目的代码,可能是学生或者爱好者在解决北京大学编程竞赛或课程作业时编写的。"pku"这...
这类问题往往需要参赛者具备扎实的数据结构基础,如链表、树、图,以及对状态转移的理解。 动态规划是解决生命周期题目的常用方法,它通过定义状态和状态转移方程,将大问题分解为小问题求解。在ACM竞赛中,掌握...
1. **基础算法**:如排序(快速排序、归并排序、堆排序)、搜索(二分查找、深度优先搜索、广度优先搜索)、图论(Dijkstra、Floyd-Warshall、最小生成树)等。 2. **数据结构**:数组、链表、栈、队列、哈希表、树...
同时,也会用到数组、链表、栈、队列、树、图等数据结构。 3. **问题分析**:解题报告会详细解释如何理解问题,识别问题的关键要素,以及如何选择合适的算法策略。 4. **代码实现**:报告会展示如何用实际代码实现...
2. **算法**:可能会涉及到排序(如快速排序、归并排序、堆排序)、搜索(如二分查找、深度优先搜索、广度优先搜索)、动态规划、贪心策略、回溯法、分支限界等。 3. **字符串处理**:在ACM中,字符串问题很常见,...
二叉查找树 线段树 RMQ LCA+RMQ SB-Tree 数论 生成紧凑素数表 分解质因子 最大公约数 a^b mod n 扩张欧几里德算法 素数表质因子分解 Stirling公式 中国剩余定理 欧拉数(递推法) 欧拉数(公式法) 十...
2. **函数**:可能有一个或多个函数定义,用于执行特定任务,如输入处理、问题求解逻辑、结果输出等。 3. **输入与输出**:C++中的输入输出操作通常通过`cin`和`cout`进行。程序员可能会使用这些流对象来读取用户...
pku1000 pku1000程序 解题报告
二叉查找树(Binary Search Tree)是一种自平衡的二分查找树,提供了快速的插入、删除和查找操作;动态规划(Dynamic Programming)是解决最优化问题的一种方法,通过将问题分解为相互重叠的子问题来求解;匈牙利...
2. 算法:排序(快速排序、归并排序、堆排序等)、搜索(深度优先搜索、广度优先搜索、A*搜索等)、动态规划、贪心算法、回溯法、分治策略等。 3. 数论:素数、模运算、最大公约数和最小公倍数、同余方程等。 4. ...
benchmark (PKU-MMD) for continuous multi-modality 3D human action understanding and cover a wide range of complex human activities with well annotated information. PKU-MMD contains 1076 long video ...
字符串处理通常包括查找、替换、排序等操作,而动态规划则是一种解决最优化问题的有效方法,通过构建状态转移方程,将原问题分解为子问题,逐步求解。 2. **1006.cpp**:这道题目的解决可能运用了图论和搜索算法。...
- **定义**:排序算法用于将一组无序的数据按照某种规则进行排列,常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序等。 - **示例题目**:如题目1423、1694等。 #### 其他 - **历法**:涉及到日期计算的...
### PKU1639 解题报告:度限制生成树 #### 题目概述 题目名称为“Picnic Planning”,来源于East Central North America 2000年比赛。题目实质上是在寻找多个字符串(代表不同生命体的DNA序列)中最长的公共子串,...