问题

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

输入

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. Unity——AssetBundle打包工具

    Unity批量打AB包 为了资源热更新,Unity支持将所有资源打包成AssetBundle资源,存放在SteamingAssets文件夹中: 在项目发布之前,需要将所有资源打包成.ab文件,动态加载 ...

  2. ArcPy获取栅格属性

    获取栅格属性 (数据管理) 描述 从元数据和栅格数据集的相关描述性统计数据中检索信息. 使用方法 返回的属性将显示在结果窗口中. 此工具的 Python 结果是地理处理结果对象.要获取字符串值,请使用 ...

  3. 搭建Mac+Java+appium+IOS真机自动化环境

    一.安装前环境准备 1.确保电脑已经有homebrew(包管理器)  下载链接[https://brew.sh/]   2.通过 brew 安装node.js brew install node 安装 ...

  4. Java(3)基本数据类型及其类型转换

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201501.html 博客主页:https://www.cnblogs.com/testero ...

  5. AgileConfig 轻量级配置中心 1.5 发布 - 支持多环境配置

    AgileConfig 从发布到现在,收到不同学的 issue 说需要多环境的支持.也就是一个应用在不同的环境下可以配置不同的配置项.这是一个非常有用的功能,就跟我们开发的时候会设置多个 appset ...

  6. NOIP模拟83(多校16)

    前言 CSP之后第一次模拟赛,感觉考的一般. 不得不吐槽多校联测 OJ 上的评测机是真的慢... T1 树上的数 解题思路 感觉自己思维有些固化了,一看题目就感觉是线段树. 考完之后才想起来这玩意直接 ...

  7. HTML中的emment

    emment的优点和使用方法: 优点:Emment是前端开发者必备的工具,使用它可以大大提高前端开发效率. 使用方法:Emment的使用方法非常简单,直接在编辑器上输入HTML和CSS代码的缩写,然后 ...

  8. spring security中ajax超时处理

    spring security为我们的系统提供了方便的认证和授权操作.在系统中完成认证和授权后,一般页面页面上大多数是ajax和后台进行操作,那么这个时候可能就会面临session超时,ajax去访问 ...

  9. (三)、Docker常用基础命令

    1.Docker 帮助命令 帮助命令: docker version 查看版本 docker info 查询docker详细信息 docker --help 查看命令帮助 2.Docker 镜像命令 ...

  10. spring cloud Alibaba --sentinel组件的使用

    sentinel组件 对于sentinel的前置知识这里就不多说了: 直接上代码: Release v1.8.1 · alibaba/Sentinel · GitHub  下载地址 springclo ...