S-Tree解题报告UVa 712二叉树/二分搜索
2017-10-16 11:09
501 查看
1.题目理解
![](https://img-blog.csdn.net/20171016112231436?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvT09GRnJhbmtEdXJh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
题意:
1.按照x_1,x_2,x_3,…,x_i的次序不断“走”,如果为0,那么向左子树走,如果是1那么向右子树走。
注意事项:
1.x_1,x_2,x_3,…,x_i对应的树的层数不确定,如图二。其中的第二层为x_1。
2.解题分析-读入数据的处理
1.给出的变量x_1,x_2,x_3,…,x_i就是树的高度-> 2^i 也即叶子结点的数目。
这样话可以先初始化一个数组作为叶子结点的container,装载所有的数据
2.再开一个数组装载x_1,x_2,x_3, …,x_i,注意只装载其中的数字即可:
scanf(" x%d",&temp);
con.push_back(temp);
如果是x3 x1 x2 那么读取完成后为->我们遍历con即可获得应有的次序(这里有读取的小技巧scanf("x%d",&temp)->
只读取其中的数字)
3.解题分析-实现
![](https://img-blog.csdn.net/20171016111000412?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvT09GRnJhbmtEdXJh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20171016111050828?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvT09GRnJhbmtEdXJh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20171016111103546?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvT09GRnJhbmtEdXJh/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
其实可以发现本质就是一个二分的过程,最终并没有建树
4.算法性能
O(2N+lgN) = O(N)
N为叶子的数目
5.解题代码
#include <cstdio>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
int main(int argc, char const *argv[])
{
int n , k = 1;
while (scanf("%d", &n) && n != 0) {
printf("S-Tree #%d:\n", k );
k++;
scanf("\n");
int length = pow(2, n);
char a[150];//最大为128 = pow(2,7);
vector<int>con;
for (int i = 0; i < n; i++)
{
int temp;
scanf(" x%d", &temp);
con.push_back(temp);
}
scanf("%s", a);
int command;
scanf("%d", &command);
for (int i = 0; i < command; i++)
{
char instructor[9];
scanf("%s", instructor);
int beginner = 1;
int ender = length;
int templength = length / 2;
for (int j = 0; j < n; j++)
{
if (instructor[con[j] - 1] == '1')
{
beginner += templength;
templength /= 2;
} else {
ender -= templength;
templength /= 2;
}
if (ender == beginner)
{
printf("%c", a[ender - 1] );
break;
}
}
}
printf("\n\n");
}
return 0;
}
刚刚入门,比较菜鸡,请多多指教!
题意:
1.按照x_1,x_2,x_3,…,x_i的次序不断“走”,如果为0,那么向左子树走,如果是1那么向右子树走。
注意事项:
1.x_1,x_2,x_3,…,x_i对应的树的层数不确定,如图二。其中的第二层为x_1。
2.解题分析-读入数据的处理
1.给出的变量x_1,x_2,x_3,…,x_i就是树的高度-> 2^i 也即叶子结点的数目。
这样话可以先初始化一个数组作为叶子结点的container,装载所有的数据
2.再开一个数组装载x_1,x_2,x_3, …,x_i,注意只装载其中的数字即可:
scanf(" x%d",&temp);
con.push_back(temp);
如果是x3 x1 x2 那么读取完成后为->我们遍历con即可获得应有的次序(这里有读取的小技巧scanf("x%d",&temp)->
只读取其中的数字)
3.解题分析-实现
其实可以发现本质就是一个二分的过程,最终并没有建树
4.算法性能
O(2N+lgN) = O(N)
N为叶子的数目
5.解题代码
#include <cstdio>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
int main(int argc, char const *argv[])
{
int n , k = 1;
while (scanf("%d", &n) && n != 0) {
printf("S-Tree #%d:\n", k );
k++;
scanf("\n");
int length = pow(2, n);
char a[150];//最大为128 = pow(2,7);
vector<int>con;
for (int i = 0; i < n; i++)
{
int temp;
scanf(" x%d", &temp);
con.push_back(temp);
}
scanf("%s", a);
int command;
scanf("%d", &command);
for (int i = 0; i < command; i++)
{
char instructor[9];
scanf("%s", instructor);
int beginner = 1;
int ender = length;
int templength = length / 2;
for (int j = 0; j < n; j++)
{
if (instructor[con[j] - 1] == '1')
{
beginner += templength;
templength /= 2;
} else {
ender -= templength;
templength /= 2;
}
if (ender == beginner)
{
printf("%c", a[ender - 1] );
break;
}
}
}
printf("\n\n");
}
return 0;
}
刚刚入门,比较菜鸡,请多多指教!
相关文章推荐
- UVa 152 - Tree's a Crowd解题报告
- UVa 1392 DNA Regions 解题报告(二分)
- 对称二叉树(tree_c)解题报告
- UVAlive 3890&Poj3525 半平面交+二分 解题报告
- pku 1308 Is A Tree 搜索 解题报告
- Uva 1267 Network 解题报告(贪心搜索)
- uva712 S-Tree (假二叉树重建)
- 【UVA 712 S-Tree】& 二叉树
- 17.7.24 校内赛 解题报告【二分答案】【记忆化搜索】【数据结构】
- 剑指offer 面试题6:重建二叉树(Leetcode105. Construct Binary Tree from Preorder and Inorder Traversal) 解题报告
- Uva 12124 Assemble 解题报告(二分)
- UVA11090 Going in Cycle!! 解题报告【判负环】【SPFA】【二分答案】
- UVA 11478 查分约束+二分答案 解题报告
- UVa 11627 Slalom 解题报告(二分)
- Leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal 先序和中序中恢复二叉树 解题报告
- hdu 2446 二分搜索解题报告
- UVa 712 - S-Trees解题报告
- Can you solve this equation? (二分搜索)解题报告
- leetCode解题报告之Binary Tree Level Order Traversal II,I(二叉树层次遍历)
- Uva 1335 Beijing Guards 解题报告(策略+二分)