问题描述

可怜的 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

解题思路

  二叉树dfs走一遍

   应注意的是对于每一个节点,进入节点与退出节点step都应+1

code

#include <stdio.h>
#include <stdlib.h>
#include <string.h>struct Node
{Node(){}int weight;int step;int left;int right;
};Node *arr = NULL;
int step = 0;void dfs(int index)
{arr[index].step = step;++step;if(arr[index].left==0){}else if(arr[index].right==0){dfs(arr[index].left);}else if(arr[arr[index].left].weight > arr[arr[index].right].weight){dfs(arr[index].left);dfs(arr[index].right);}else{dfs(arr[index].right);dfs(arr[index].left);}++step;
}int main()
{int i;int n,m,k;scanf("%d",&n);arr = (Node *)malloc(sizeof(Node)*(n+1));memset(arr,0,sizeof(Node)*(n+1));int fa_index,weight;for(i=2;i<=n;i++){scanf("%d %d",&fa_index,&weight);if(arr[fa_index].left==NULL)arr[fa_index].left = i;else // (arr[fa_index].left!=NULL)arr[fa_index].right = i;arr[i].weight = weight;}dfs(1);scanf("%d",&m);for(i=1;i<=m;i++){scanf("%d",&k);printf("%d ",arr[k].step);}free(arr);return 0;
}

转载于:https://www.cnblogs.com/cbattle/p/7790227.html

数据结构_Search相关推荐

  1. 数据结构+算法 学习计划与资源

    学了很多杂乱的技术,继续成长 渐感吃力,重新学习数据结构 与 算法. 计划: 1.严蔚敏<数据结构><大话数据结构>,每天一个小例子. 2.采用C++ 或者C .尽量用C++实 ...

  2. 【ES系列】ES的数据结构与DSL语法

    ES的数据结构与DSL语法 数据结构部分 正向索引与倒排索引 定义 结构 分词(keyword) DSL语句 常用DSL语句 索引部分 创建索引 查看es所有索引 查看单个索引 删除索引 文档部分 创 ...

  3. Elasticsearch 入门 核心概念 数据结构 分词器 javaAPI

    ElasticSearch 1-今日内容 2-初识ElasticSearch 2.1-基于数据库查询的问题 2.2-倒排索引 2.2.1 评分TF/IDF/BM25计算 2.3-ES存储和查询的原理 ...

  4. 数据结构(08)— 线性单链表基本操作

    1. 线性单链表数据结构 // 假定每个结点的类型用 SNode 表示 typedef struct SNodeTag {int data; // 所存储的数据元素SNodeTag *next; // ...

  5. 数据结构(06)— 线性循环链表实战

    1. 循环链表定义 单链的循环链表结点的存储结构和单链表的存储结构一样, 所不同的是: 最后一个结点的 next 域指向头结点, 而不是"空".这样, 由表尾很容易找到表头. 但若 ...

  6. 数据结构(05)— 线性单链表实战

    1. 设计思路 本项目的实质是完成对考生信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运行结 ...

  7. 数据结构(04)— 线性顺序表实战

    1. 设计思路 本实战的实质是完成对学生成绩信息的建立.查找.插入.修改.删除等功能,可以首先定义项目的数据结构,然后将每个功能写成一个函数来完成对数据的操作,最后完成主函数以验证各个函数功能并得出运 ...

  8. 数据结构(03)— 数据处理基本操作(数据的查找、新增、删除、修改)

    我们先来看一个关于查找的例子.查找,就是从复杂的数据结构中,找到满足某个条件的元素.通常可从以下两个方面来对数据进行查找操作:​ 根据元素的位置或索引来查找: 根据元素的数值特征来查找. 针对上述两种 ...

  9. 数据结构(02)— 时间复杂度与空间复杂度转换

    1. 时间复杂度转化为空间复杂度 常用的降低时间复杂度的方法有递归.二分法.排序算法.动态规划等,降低空间复杂度的核心思路就是,能用低复杂度的数据结构能解决问题,就千万不要用高复杂度的数据结构. ​ ...

最新文章

  1. Linux8-bash shell的基础特性:globbing、IO重定向及管道
  2. 《数据库系统概念》7-函数、存储过程、触发器
  3. 85. Leetcode 746. 使用最小花费爬楼梯 (动态规划-基础题)
  4. 阿里90后工程师,如何用AI程序写出双11打call歌?
  5. ​【文末有福利】揭秘阿里中台!一文看懂阿里推荐业务的两项利器
  6. r语言实现sem_统计基础:【18】使用Excel和R语言来实现抽样
  7. 【转】拷贝构造函数的参数类型必须是引用
  8. 微信小程序调查报告(二)-账号注册篇
  9. virtual关键字的使用(C# 参考)
  10. a算法和a*算法的区别_机器人路径规划算法,全局路径规划与局部路径规划究竟有哪些区别?...
  11. ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  12. js2D物理引擎插件
  13. Windows2008虚拟机扩容C盘
  14. CARLA 笔记(05)— Actors and blueprints(创建和修改 Blueprint、生成 Spawning、使用 Handling、销毁 Destruction)
  15. js立即执行函数,jqueryReady和Onload执行顺序比较
  16. iOS 导航栏下拉菜单框
  17. WPS文字中通过宏加快捷键实现仿word中Lorem()函数的功能
  18. unicode字符转换成中文
  19. 北美电影票房Top10-2020年1月31日:《绝地战警3》三连冠
  20. Rails中嵌套表单的解决

热门文章

  1. C++之queue模板类
  2. datetime 和 smalldatetime
  3. jquery 选择时间(小时)区间(二)
  4. SQL Server 2005中解决死锁问题
  5. Linux安装—IP设置
  6. 深圳美景品牌策划机构:美景、BOBDOG传媒合作论坛广州举行
  7. Eclipse下配置主题颜色
  8. ubuntu12.0.4不能正常关机和重启的解决方法
  9. 防止一个进程被多次启动
  10. Linux下一些操作命令