实现二叉树(search)
★实验任务
可怜的 Bibi 刚刚回到家,就发现自己的手机丢了,现在他决定回头去搜索 自己的手机。 现在我们假设 Bibi 的家位于一棵二叉树的根部。在 Bibi 的心中,每个节点 都有一个权值 x,代表他心中预感向这个节点走可能找回自己手机的程度(虽然 他的预感根本不准)。当 Bibi 到达一个节点时,如果该节点有未搜索过的儿子节 点,则 Bibi 会走向未搜索过的儿子节点进行搜索,否则就返回父亲节点。如果 某节点拥有两个未搜索过的儿子节点,Bibi 会选择先搜索权值大的儿子节点。 假设 Bibi 从一个节点到达另一个节点需要 1 单位时间,搜索节点的时间忽 略不计,那么请问当 Bibi 的手机位于编号为 k 的节点时,他需要多少单位时间 才能找到手机。
★数据输入
输入第一行为一个正整数 n(1≤n≤100000)表示树的节点数目,树根的编号 总是为 1。 接下来 n-1 行,每行两个正整数 p,x(1≤x≤100)。代表编号为 i 的节点的父 亲节点 p 和权值 x。这里的 i 从 2 依次数到 n。数据保证输入的 p 小于当前的 i, 且互为兄弟的两个节点的权值 x 不同。 第 n+1 行一个整数 m(1≤m≤n), 表示询问组数。 第 n+2 行有 m 个整数,每个整数 ki(1≤ki≤n)代表该组询问中手机的位置。
★数据输出
输出 m 行,每行一个整数,代表 Bibi 找到手机需要花费的单位时间数量。
测试样例
输入:
3
1 20
1 30
3
1 2 3
输出:
0
3
1
解题过程:
暂时个人认为二叉树其实更好实现,因为之前对于儿子个数不确定的树需要用链表很不熟悉(不过现在感觉用动态数组vector可以好多了),而二叉树每个节点有两个儿子实现就比较简单;
解题思路:
通过深搜的方法实现,用递归回溯的思想对走的步数(即时间)进行计算并同步存储,这题还需要我们同时对每个节点的时间存储,因为访问的次数可能会很多容易超时。
代码:
给我帮助的同学的代码(通过vector写):
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#include<algorithm>
#define MAX_SIZE 100005
using namespace std;
struct node
{
int quan, bu;
bool vis;
}tree[MAX_SIZE];
vector <int> v[MAX_SIZE];
int cnt = -1;
int n;
void dfs(int ge)
{
cnt++;
if (tree[ge].vis == false)
{
tree[ge].vis = true;
tree[ge].bu = cnt;
}
if (!v[ge].empty())
{
vector<int>::iterator it;
for (it = v[ge].begin(); it != v[ge].end(); it++)
dfs(*it);
}
cnt++;
}
int main()
{
int i, j;
scanf("%d", &n);
for (i = 1; i <= n; i++)
v[i].clear();
for (i = 2; i <= n; i++)
{
int a, b;
scanf("%d%d", &a, &b);
tree[i].quan = b;
tree[i].vis = false;
v[a].push_back(i);
}
for (i = 1; i <= n; i++)
{
if (!v[i].empty() && v[i].size()>1)
{
if (tree[v[i][0]].quan<tree[v[i][1]].quan)
swap(v[i][0], v[i][1]);
}
}
dfs(1);
int m;
scanf("%d", &m);
for (i = 1; i <= m; i++)
{
int a;
scanf("%d", &a);
printf("%d\n", tree[a].bu);
}
// system("pause");
return 0;
}
之后对我之前用数组实现的代码的改进实现:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<vector>
#define MAX_SIZE 100005
using namespace std;
int cnt = -1;
struct Node
{
int ele;
int son1, son2;
int vis;
int ste;
}node[MAX_SIZE];
void dfs(int loca)
{
cnt++;
if (node[loca].vis == 0)
{
node[loca].vis = 1;
node[loca].ste = cnt;
}
if (node[node[loca].son1].vis == 0 && node[loca].son1 != 0)
{
dfs(node[loca].son1);
cnt++;
}
if (node[node[loca].son2].vis == 0 && node[loca].son2 != 0)
{
dfs(node[loca].son2);
cnt++;
}
}
int main()
{
int n, i, j;
cin >> n;
for (i = 2; i <= n; i++)
{
int father;
cin >> father >> node[i].ele;
if (node[father].son1 == 0)node[father].son1 = i;
else
{
if (node[node[father].son1].ele < node[i].ele)
{
node[father].son2 = node[father].son1;
node[father].son1 = i;
}
else node[father].son2 = i;
}
node[i].vis = 0;
}
dfs(1);
int m;
cin >> m;
for (i = 1; i <= m; i++)
{
int tmp;
cin >> tmp;
cout << node[tmp].ste << endl;
}
return 0;
}
题目收获:二叉树可以方便的通过数组实现,而树其实也不会很难,可以通过vector动态数组实现就行。
实现二叉树(search)的更多相关文章
- [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法
二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...
- [CareerCup] 4.7 Lowest Common Ancestor of a Binary Search Tree 二叉树的最小共同父节点
4.7 Design an algorithm and write code to find the first common ancestor of two nodes in a binary tr ...
- [Swift]LeetCode1008. 先序遍历构造二叉树 | Construct Binary Search Tree from Preorder Traversal
Return the root node of a binary search tree that matches the given preorder traversal. (Recall that ...
- PAT 1043 Is It a Binary Search Tree[二叉树][难]
1043 Is It a Binary Search Tree(25 分) A Binary Search Tree (BST) is recursively defined as a binary ...
- [线索二叉树] [LeetCode] 不需要栈或者别的辅助空间,完成二叉树的中序遍历。题:Recover Binary Search Tree,Binary Tree Inorder Traversal
既上篇关于二叉搜索树的文章后,这篇文章介绍一种针对二叉树的新的中序遍历方式,它的特点是不需要递归或者使用栈,而是纯粹使用循环的方式,完成中序遍历. 线索二叉树介绍 首先我们引入“线索二叉树”的概念: ...
- 【LeetCode】Validate Binary Search Tree ——合法二叉树
[题目] Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defin ...
- 一道二叉树题的n步优化——LeetCode98validate binary search tree(草稿)
树的题目,往往可以用到三种遍历.以及递归,因为其结构上天然地可以往深处递归,且判断条件也往往不复杂(左右子树都是空的). LeetCode 98题讲的是,判断一棵树是不是二叉搜索树. 题目中给的是标准 ...
- PAT甲题题解1099. Build A Binary Search Tree (30)-二叉树遍历
题目就是给出一棵二叉搜索树,已知根节点为0,并且给出一个序列要插入到这课二叉树中,求这棵二叉树层次遍历后的序列. 用结构体建立节点,val表示该节点存储的值,left指向左孩子,right指向右孩子. ...
- PAT 1064 Complete Binary Search Tree[二叉树][难]
1064 Complete Binary Search Tree (30)(30 分) A Binary Search Tree (BST) is recursively defined as a b ...
随机推荐
- WebLogic远程命令执行
靶机说明 目标ip:172.16.53.28(window 2003) 本靶机所针对的序列化漏洞系列以及常见安全问题如下: 弱口令登陆控制台部署war包webshell CVE-2018-2893 C ...
- python列表,元组,字典和字符串之间的相互转换
元组转换成列表 >>> mytuple = (1,2,3) >>> print list(mytuple) [1, 2, 3] 列表转换成元组 >>&g ...
- SpringCloud-容错处理Hystrix熔断器(五)
前言:微服务架构应用的特点就是多服务,而服务层之间通过网络进行通信,从而支撑起整个应用系统,所以,各个微服务之间不可避免的存在耦合依赖关系.但任何的服务应用实例都不可能永远的健康或网络不可能永远的都相 ...
- [CF1027F]Session in BSU[最小基环树森林]
题意 有 \(n\) 门课程,每门课程可以选择在 \(a_i\) 或者 \(b_i\) 天参加考试,每天最多考一门,问最早什么时候考完所有课程. \(n\leq 10^6\). 分析 类似 [BZOJ ...
- 【JUC源码解析】DelayQueue
简介 基于优先级队列,以过期时间作为排序的基准,剩余时间最少的元素排在队首.只有过期的元素才能出队,在此之前,线程等待. 源码解析 属性 private final transient Reentra ...
- 菜鸟vimer成长记——第2.4章、cmd-line模式
cmd-line模式又有3个类型:Ex 命令(ex commands).查找模式(Search patterns).Filter 命令(Filter commands).本文主要重点的是Ex 命令和S ...
- Ansible详解(一)基础安装和配置
ansible 是一款轻量级自动化运维工具,由的 Python 语言开发,结合了多种自动化运维工具的特性,实现了批量系统配置,批量程序部署,批量命令执行等功能; ansible 是基于模块化实现批量操 ...
- CSS清浮动办法
骨灰级解决办法: .clear{clear:both;height:0;overflow:hidden;} 上诉办法是在需要清除浮动的地方加个div.clear或者br.clear,我们知道这样能解决 ...
- 在WebGL场景中管理多个卡牌对象的实验
这篇文章讨论如何在基于Babylon.js的WebGL场景中,实现多个简单卡牌类对象的显示.选择.分组.排序,同时建立一套实用的3D场景代码框架.由于作者美工能力有限,所以示例场景视觉效果可能欠佳,本 ...
- Unity Shader 学习之旅
Unity Shader 学习之旅 unityshader图形图像 纸上学来终觉浅,绝知此事要躬行 美丽的梦和美丽的诗一样 都是可遇而不可求的——席慕蓉 一.渲染流水线 示例图 Tips:什么是 GP ...