★实验任务

可怜的 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)的更多相关文章

  1. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  2. [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 ...

  3. [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 ...

  4. 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 ...

  5. [线索二叉树] [LeetCode] 不需要栈或者别的辅助空间,完成二叉树的中序遍历。题:Recover Binary Search Tree,Binary Tree Inorder Traversal

    既上篇关于二叉搜索树的文章后,这篇文章介绍一种针对二叉树的新的中序遍历方式,它的特点是不需要递归或者使用栈,而是纯粹使用循环的方式,完成中序遍历. 线索二叉树介绍 首先我们引入“线索二叉树”的概念: ...

  6. 【LeetCode】Validate Binary Search Tree ——合法二叉树

    [题目] Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defin ...

  7. 一道二叉树题的n步优化——LeetCode98validate binary search tree(草稿)

    树的题目,往往可以用到三种遍历.以及递归,因为其结构上天然地可以往深处递归,且判断条件也往往不复杂(左右子树都是空的). LeetCode 98题讲的是,判断一棵树是不是二叉搜索树. 题目中给的是标准 ...

  8. PAT甲题题解1099. Build A Binary Search Tree (30)-二叉树遍历

    题目就是给出一棵二叉搜索树,已知根节点为0,并且给出一个序列要插入到这课二叉树中,求这棵二叉树层次遍历后的序列. 用结构体建立节点,val表示该节点存储的值,left指向左孩子,right指向右孩子. ...

  9. PAT 1064 Complete Binary Search Tree[二叉树][难]

    1064 Complete Binary Search Tree (30)(30 分) A Binary Search Tree (BST) is recursively defined as a b ...

随机推荐

  1. Cannot find an exact (case-sensitive) match for 'crtbp.m

    http://www.ilovematlab.cn/forum.php?mod=viewthread&tid=277326&page=1&extra=#pid3296048

  2. Noip前的大抱佛脚----字符串

    目录 字符串 经验 用FFT求解字符串匹配问题 两(多)串DP时状态合并 最长公共子序列转LIS 位运算最大值 挂链哈希 哈希处理回文串 树哈希 字符串模板库 KMP 最小循环表示 Mancher A ...

  3. 前端- jquery- 总结

    1.jquery与js的区别 (1)javascript的缺点 书写繁琐,代码量大 代码复杂 动画效果,很难实现.使用定时器 各种操作和处理 (2) JavaScript和jquery的定义 Java ...

  4. 3931: [CQOI2015]网络吞吐量

    3931: [CQOI2015]网络吞吐量 链接 分析: 跑一遍dijkstra,加入可以存在于最短路中的点,拆点最大流. 代码: #include<cstdio> #include< ...

  5. Openstack入门篇(十二)之neutron服务(计算节点)的部署与测试

    1.Neutron组件安装 [root@linux-node2 ~]# yum install -y openstack-neutron-linuxbridge ebtables ipset 2.配置 ...

  6. pycharm如何回到过去某个时间

    在编写代码是,我们可能会写错代码,或者是误删某个文件,那么问题来了,如何回到过去的某个时间段,来弥补我们犯下的错呢? 1.如果是恢复删除的文件则右击之前文件所在的文件夹 2.右击文件夹的显示效果如图 ...

  7. 如何把项目通过git上传之github完整教程

    作为一个有追求的程序员,需要撸点自己的开源项目,虽然我现在只是在学着造轮子,但这并不影响我成为大神的心.Github是基于git实现的代码托管,很多程序员在上面托管自己的开源项目,我使用Github也 ...

  8. 3.PO如何给开发团队讲好故事

    敏捷开发系列文章目录 讲出符合开发团队味口的故事. 上一章说了敏捷开发团队的构成与迭代过程,本章重点说一下迭代第一天的计划会议.熟话说“好的开始就成功了一半”,一个迭代的计划会议做得好不好确实直接注定 ...

  9. eclipse—Maven项目打包成exe

    1.下载打包工具j2ewiz  友情连接:https://pan.baidu.com/s/1Rcoqix5QcrJVI1of9h7qbQ提取码:vqn1 2.选中想要打包的文件,右击—Export 按 ...

  10. JDK 和 JRE 有什么区别

    JDK是Java开发工具包(Java Development Kit),JRE是Java运行环境(Java Runtime Environment),JDK包含了JRE,搭建Java环境的时候,安装J ...