问题

给出一颗二叉树,每个节点有一个编号和一个值,该值可能为负数,请你找出一个最优节点(除根节点外),使得在该节点将树分成两棵树后(原来的树移除这个节点及其子节点,新的树以该节点为根节点),分成的两棵树各 节点的和之间的差绝对值最大。请输出该节点编号,如有多个相同的差,输出编号最小的节点。

输入

4

4 9 -7 -8

0 1

0 3

1 2

第一行,四个节点,编号0-3,范围为1-10000

第二行,节点0-3的权值

第三行到第五行,表示二叉树各节点间的父子关系

0 1 // 节点0的左节点是1

0 3 // 节点0的右节点是3

1 2 // 节点1的左节点是2

注意:左节点永远出现在右节点之前

0:4

/ \

1:9 3:-8

/

2:-7

输出

节点编号,示例中编号为3的节点是最优节点

解法

(我没有参与考试。。。我自己找的数据都可以过,逻辑应该是对的)

#include <iostream>
#include <sstream>
#include <vector>
#include <map>
#include <unordered_map> using namespace std;
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
explicit TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
}; TreeNode *creatTree(vector<int> &valArr, vector<vector<int>> &arr){
unordered_map<int, TreeNode*> map;
for(auto &it:arr){
if(map.find(it[0]) == map.end()){
auto node = new TreeNode(it[0]);
map[it[0]] = node;
}
auto node = map[it[0]];
if(node->left != nullptr){
node->right = new TreeNode(it[1]);
map[it[1]] = node->right;
}else{
node->left = new TreeNode(it[1]);
map[it[1]] = node->left;
}
}
return map[arr[0][0]];
}
unordered_map<int, int> hashMap;
int proOrderByRecur(TreeNode *node, vector<int> &valArr){
if(node == nullptr){
return 0;
}
int L = proOrderByRecur(node->left, valArr);
int R = proOrderByRecur(node->right, valArr);
hashMap[node->val] = L + R + valArr[node->val];
return L + R + valArr[node->val];
}
void solution(TreeNode *head, vector<int> &valArr) {
proOrderByRecur(head, valArr);
int index ;
int total = hashMap[head->val];
int maxVal = 0; for(auto &it : hashMap){
if(it.first == head->val) continue;
if(abs(total - 2 * it.second) > maxVal){
maxVal = abs(total - 2 * it.second);
index = it.first;
}else if(abs(total - 2 * it.second) == maxVal){
index = min(index, it.first);
}
}
cout<<index<<endl;
}
void test(){
int n;
while(cin >> n){
cin.ignore();
string s1;
while(getline(cin, s1)){
stringstream ss1(s1);
vector<int> valArr;
while(getline(ss1, s1, ' ')){
valArr.push_back(stoi(s1));
}
vector<vector<int>> arr; for (int i = 0; i < n-1; ++i) {
string s2;
while(getline(cin, s2)){
stringstream ss2(s2);
vector<int> A;
while(getline(ss2, s2, ' ')){
A.push_back(stoi(s2));
}
arr.push_back(A);
break;
}
}
auto head = creatTree(valArr, arr);
solution(head, valArr);
break;
}
}
} int main() {
test();
return 0;
}

华为9.8笔试题C++的更多相关文章

  1. 华为C语言笔试题集合

    ①华为笔试题搜集 1.static有什么用途?(请至少说明两种)     1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变.     2) 在模块内(但在函数体外),一个被声明为 ...

  2. 华为C/C++笔试题&答案

    1.static有什么用途?(请至少说明两种) 1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问 ...

  3. C++笔试题(四)

    华为从事通信网络技术与产品的研究.开发.生产与销售,是中国电信市场的主要供应商之一,并已成功进入全球电信市场.每年华为都要在各大高校招聘大批的应界生,特别是华中科技大学.公司网址是:http://ww ...

  4. 华为Java笔试题

    华为Java笔试题+数据库题 一. 单项选择题 1.Java是从( )语言改进重新设计. A.Ada B.C++ C.Pasacal D.BASIC 2.下列语句哪一个正确( ) A. Java程序经 ...

  5. 华为2018软件岗笔试题之第一题python求解分享

    闲来无事,突然看到博客园首页上有人写了篇了华为2018软件岗笔试题解题思路和源代码分享.看了下题目,感觉第一题能做出来,就想着用刚刚学的python试着写一下,花费的时间有点长~~,看来又好长时间没练 ...

  6. C/C++ 笔试题

    /////转自http://blog.csdn.net/suxinpingtao51/article/details/8015147#userconsent# 微软亚洲技术中心的面试题!!! 1.进程 ...

  7. 嵌入式Linux C笔试题积累(转)

    http://blog.csdn.net/h_armony/article/details/6764811 1.   嵌入式系统中断服务子程序(ISR) 中断是嵌入式系统中重要的组成部分,这导致了很 ...

  8. C/C++笔试题(很多)

    微软亚洲技术中心的面试题!!! .进程和线程的差别. 线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位 (2 ...

  9. 【转】C++笔试题汇总

    原文:http://www.cnblogs.com/ifaithu/articles/2657663.html C#C++C多线程面试1.static有什么用途?(请至少说明两种)1)在函数体,一个被 ...

随机推荐

  1. 题解 CF833D Red-Black Cobweb

    题目传送门 题目大意 给出一个 \(n\) 个点的树,每条边有边权和颜色 \(0,1\) ,定义一条链合法当且仅当 \(0,1\) 颜色的边数之比小于等于 \(2\) ,求所有合法的链的边权之积的积. ...

  2. RA-28000 账号被锁定的解决办法

    ORA-28000 账号被锁定的解决办法 错误场景:当使用sqlplus进行登录时报错:ORA-28000 账号被锁定.错误原因:由于oracle 11g 在默认在default概要文件中设置了密码最 ...

  3. MyBatis的框架设计

    1.MyBatis的框架设计 2.整体设计 2.1 总体流程 (1)加载配置并初始化       触发条件:加载配置文件 配置来源于两个地方,一处是配置文件,一处是Java代码的注解,将SQL的配置信 ...

  4. C程序内存布局

    作为计算机专业的来说,程序入门基本都是从C语言开始的,了解C程序中的内存布局,对我们了解整个程序运行,分析程序出错原因,会起到事半功倍的作用 . C程序的内存布局包含五个段,分别是STACK(栈段), ...

  5. 【UE4 C++ 基础知识】<7> 容器——TSet

    概述 TSet是一种快速容器类,(通常)用于在排序不重要的情况下存储唯一元素. TSet 类似于 TMap 和 TMultiMap,但有一个重要区别:TSet 是通过对元素求值的可覆盖函数,使用数据值 ...

  6. Zabbix 5.0:监控阿里云RDS

    Blog:博客园 个人 由于近期压测,需要频繁登录阿里云查看RDS监控,每次登录查看监控步骤较为繁琐,故将监控接入到zabbix. 概述 由于阿里云已做了RDS的监控,我们只需要通过阿里云SDK把这些 ...

  7. stm32学习心得体会

    stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm ...

  8. 21.6.4 test

    \(NOI\) 模拟赛 太离谱了,碳基生物心态极限 \(T1\),字符串滚出OI,最后想了个区间dp,期望得分32pts,实际得分0pts,不知为啥挂了.正解是没学过的SAM. \(T2\),正解博弈 ...

  9. C++链表常见面试考点

    链表常见问题: 单链表找到倒数第n个节点 用两个指针指向链表头,第一个指针先向前走n步,然后两个指针同步往前走,当第一个指针指向最后一个节点时,第二个指针就指向了倒数第n个节点. 判断链表有没有环 快 ...

  10. fd定时器--timerfd学习

    定时器 可以用系统定时器信号SIGALARM 最近工作需要于是又发现了一个新玩意timerfd配合epoll使用. man 手册看一下 TIMERFD_CREATE(2) Linux Programm ...