9.8华为机考第一题

通过95%,忽略复杂度😂
请大佬赏脸看一下,没过的5%是因为什么?
【问题】
给出一颗二叉树,每个节点有一个编号和一个值,该值可能为负数,请你找出一个最优节点(除根节点外),使得在该节点将树分成两棵树后(原来的树移除这个节点及其子节点,新的树以该节点为根节点),分成的两棵树各 节点的和之间的差绝对值最大。请输出该节点编号,如有多个相同的差,输出编号最小的节点。
【输入】
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<string>
#include<vector>
#include<algorithm>
using namespace std;
struct TreeNode {
	int val;
	TreeNode* left;
	TreeNode* right;
	TreeNode():val(0),left(nullptr),right(nullptr){}
	TreeNode(int _val):val(_val), left(nullptr), right(nullptr) {}
};
int MaxofAbs_val = 0;	// 两树节点和的差值绝对值  的最大值
int sum0 = 0;			// 原树所有节点和
TreeNode* res = nullptr;// 结果节点
int SumofTree(TreeNode* node) {
	if(node == nullptr) return 0;
	return node->val+ SumofTree(node->left)+SumofTree(node->right);
}
void compare(TreeNode* node) {
	if (node == nullptr)return;
	// cout <<">>":" <<node->val << endl;
	int newtree_sum = SumofTree(node);
	int oldtree_sum = sum0 - newtree_sum;
	// cout << "newtree_sum " << newtree_sum << " , " << "oldtree_sum" << oldtree_sum << endl;
	if (MaxofAbs_val < abs(newtree_sum - oldtree_sum)) {
		MaxofAbs_val = abs(newtree_sum - oldtree_sum);
		res = node;
	}
	// cout << "abs(newtree_sum - oldtree_sum)" << abs(newtree_sum - oldtree_sum) << endl;
	compare(node->left);
	compare(node->right);
}
void qianxubianli(TreeNode* head) {
	if (head == nullptr)return;
	compare(head->left);
	compare(head->right);
}
int main() {
	int n;	// 节点个数
	cin >> n;
	vector<int> arr_val(n, 0);	// 节点权值
	vector<TreeNode*> arr_ptr;	// 节点指针
	
	for (int i = 0; i < n; i++) {
		cin >> arr_val[i];
		TreeNode* node = new TreeNode(arr_val[i]);
		arr_ptr.push_back(node);
		sum0 += arr_val[i];
	}
	vector<vector<int> > arr_rel(n-1, vector<int>(2,0));// 除去根节点
    // 建树
	cin >> arr_rel[0][0] >> arr_rel[0][1];
	arr_ptr[arr_rel[0][0]]->left = arr_ptr[arr_rel[0][1]];
	for (int i = 1; i < n - 1; i++) {
		cin >> arr_rel[i][0] >> arr_rel[i][1];
		if (arr_rel[i][0] == arr_rel[i - 1][0]) {
			arr_ptr[arr_rel[i][0]]->right = arr_ptr[arr_rel[i][1]];
		}
		else
		{
			arr_ptr[arr_rel[i][0]]->left = arr_ptr[arr_rel[i][1]];
		}
	}
	// 前序遍历二叉树并比较差值绝对值大小
	qianxubianli(arr_ptr[0]);
	for (int i = 0; i < n; i++) {
		if (res->val == arr_val[i]) {
			cout << i;
			break;
		}
	}
	return 0;
}




#华为机试##笔试题目##华为#
全部评论
怎么确定二叉树的根节点呀,还是说默认的0号结点是根节点
1 回复 分享
发布于 2021-09-08 23:10
我也是95%,不过是java写的
点赞 回复 分享
发布于 2021-09-08 23:05
最后几行,通过value确定node肯定有问题啊😂
点赞 回复 分享
发布于 2021-09-08 23:05
先sum 所有权值然后遍历每一个子节点,求子节点产生树的的权值的和,记录每一次的查与差的最大值比较,最后返回差最大的子节点的索引
点赞 回复 分享
发布于 2021-09-10 11:11

相关推荐

AI牛可乐:哎呀,听起来牛可乐的朋友最近有点儿烦恼呢。先抱抱你,失业的日子确实不好过,但是牛可乐相信你一定可以找到属于自己的工作哒!你平时都玩些什么游戏呢?有没有什么特别擅长的或者喜欢的游戏呢?嘿嘿,不过牛可乐觉得,找工作的劲头也很重要哦,我们可以一起想想办法,让你找工作不那么累,好不好?对了,悄悄告诉你,点击牛可乐的头像,我们可以私信聊聊,可能会有意想不到的收获哦!🐮💪🌟
点赞 评论 收藏
分享
10-25 18:22
已编辑
天津工业大学 Java
9.18:在boss海投点到德科(华为od)的java开发岗,本着来都来了的原则,点了沟通,hr向我获取身份证号开启流程,是否拿到了双证,要了双证照片,给我发了机考注意事项,非目标院校最好300+9.25:聊天,问我大概计划什么时候考,我回复9.279.26:做了几道原题感觉速度太慢了,推到国庆10.4:笔试:我考的E卷,在网上看到都说是原题,我考的3道题也是原题。1.最大花费金额&nbsp;2.&nbsp;选修课&nbsp;3.Wonderland10.11:hr电话,对个人情况做扩充:今年刚毕业?A:对;毕业之后到现在这段时间在做什么?46级过了吗?A:没过;&nbsp;考虑华为这边的工作岗位是什么原因?老家哪里的?现在在哪?意向工作地点?为什么考虑去东莞发展?打算长期在东莞发展吗?加班情况之前有了解吗?你机考前有刷过题库吗?A:有刷过;你考试中有遇到相似的题目吗?A:没有,题库还是很大的;你的机考有一个需要澄清的点,就是编程题1相似度比较高,显示有作弊嫌疑所以你要澄清下,是这个题是常规题吗?A:是常规题,双指针确实比较常见。10.12:综面:除了问秋招和春招情况,大概问的和hr打的电话问的差不多。过了后跟hr提交了一些资料,hr帮忙联系部门,帮了我联系了不需要4级的部门,所以我不用进行英语测试了。10.16:技术一面:紧张,答得磕磕巴巴,面了1小时二十几分钟,面试官还是很耐心的,。1.&nbsp;讲一下简历以外的技术经历或经验2.&nbsp;我看你是应届的嘛,毕业后有实际的项目经验吗?&nbsp;&nbsp;没有3.&nbsp;你之前的比赛是怎样分工,或者说开发流程是怎样的?4.&nbsp;其实你可以简单的概括下,你们大学里有学过软件工程之类的课吧?有学过。5.&nbsp;你其实说的实际过程,其实就是软件工程里的一个基本流程对吧?对&nbsp;(其实软件工程忘光了)6.&nbsp;你有关注到使用的jdk版本吗?有,第一次使用java8,之后都用的11,17.7.&nbsp;你能简单说一下这几个版本之间的差距吗?其实我分不清区别8.&nbsp;那你为什么要用最新的版本呢?尝试跟下版本。9.&nbsp;java8有用到stream流吗?有,经常用,sort,过滤,聚合什么的。10.&nbsp;java8里有一些并行的使用方式有用到吗?多线程,thread对吧?11.&nbsp;thread一直都有的,有一个mapreduce类似于带框架?不了解,只知道有个线程池12.&nbsp;线程池有用过吗?学习中有用到,项目中没有13.&nbsp;我看到你的简历里面,在学习有用到redis对吧?对14.&nbsp;在你的秒杀系统项目中,redis用来做什么?做缓存,减小数据库的压力15.&nbsp;数据库的压力有多大,redis为什么能减小数据库的压力?(数据库压力答的跑题,redis减小数据库的访问)16.&nbsp;jmeter有用过吗?有,一次。17.&nbsp;jmeter在使用时可以设置哪些参数?线程组设置多少个线程,http请求参数,18.&nbsp;你那个两千个qts是怎么得出来的?估计值,设置多少个线程执行多少次。19.&nbsp;你能解释一下乐观锁是什么意思?行锁,巴拉巴拉20.&nbsp;乐观锁的定义是什么?(上个问题答错了)不太了解,胡说了一点之后,沉默了一段时间。21.&nbsp;你可以去关注一下原理,不要只是关注怎么用的,我其实想问为什么你可以通过乐观锁可以解决超卖?用消息队列将并行请求转串行,交给订单处理模块,再进行数据库写入,这样数据库压力小了许多22.&nbsp;令牌桶算法清楚吗?巴拉巴拉23.&nbsp;用令牌桶算法做限流会有什么问题?只回答了可能产生请求波峰。24.&nbsp;你项目中令牌桶是自己实现还是外部模块?外部模块,名字忘了。25.&nbsp;redis预处理和rabbitmq使用时有什么注意事项?我回答了redis需要预热,rabbitmq没有太多经验26.&nbsp;你用的时候有没有碰到什么问题?redis把内存有没有占满之类的?遇到的问题最大的是:启动了几个java微服务cpu干到100%27.&nbsp;用redis会去看使用资源情况吗?我就会个top命令。28.&nbsp;使用redis的代码,你记得语法吗?用redis什么什么来着记不清了(两年前的项目了,好久没碰springboot了),还有用springboot提供的一个缓存抽象模块,用注解的方式使用redis(也是忘得差不多了)。29.&nbsp;用注解的方式你会设置哪些参数?k和v,过期时间30.&nbsp;你另一个项目你负责什么?31.&nbsp;这里涉及到最短和次优线路;对,那个算法我写的32.&nbsp;简单的介绍一下这个算法。答的挺差的33.&nbsp;时间复杂度多少?n^2吧34.&nbsp;深度搜索n^2就可以搞定吗?没算过35.&nbsp;怎么判断是最短路径?36.&nbsp;深度搜索的关键条件或者逻辑是什么?37.&nbsp;我应该找一道深度搜索题给你做一下。(不要啊)38.&nbsp;开发接口是怎么设计的,输出的是什么东西?39.&nbsp;有了解过,接口开发规范吗?40.&nbsp;开发时,回去考虑冥等性的41.&nbsp;数据库设计的范式有了解吗?42.&nbsp;java多线程事务有用过吗?手撕代码。三部分和:给一个数组int[]&nbsp;test&nbsp;=&nbsp;new&nbsp;int[]{3,&nbsp;1,&nbsp;4&nbsp;,2,2&nbsp;,1&nbsp;,3&nbsp;,1},定义i=2,j=5&nbsp;要求下标i左边数组,i、j包围的数组,j右边的数组和相同(不包括下标为i,j的数组元素),如[3,1],[2,2],[3,1]数组和相同10.19:技术二面:周六傍晚面的,估计面试官赶着下班+看到是应届生,问的比较简单。我没怎么记录。首先手撕leetcode113.&nbsp;路径总和&nbsp;II问了几个八股,慢sql,和项目的redis干嘛的,记不大清了。一二面评级不一致,过两天还有技术三面,估计是狠狠拷打了。10.25更新:10.24:三面1.&nbsp;自我介绍2.&nbsp;你掌握技术比较扎实的是哪些?3.&nbsp;Java&nbsp;sdk大量的库,你哪块用的比较多?4.&nbsp;你对这一块整体有什么了解,有没有对java集合做整体的学习(问的应该是List,Map之类的接口和实现之类的架构)5.&nbsp;list,set,map特性和适用场景(项目中的场景)6.&nbsp;这里面哪些是线程安全的7.&nbsp;你基于什么判断哪一块用这个(arraylist,linkedlist,hashmap...)是比较合适的。8.&nbsp;mysql这里你主要做设计,还是相关的开发或者优化之类的?9.&nbsp;数据库设计这里有什么经验?10.&nbsp;有了解数据库的范式吗?(有了解,但不知道QAQ)11.&nbsp;比如说第一范式,具体设计有实例吗12.&nbsp;写sql的相关经验介绍下13.&nbsp;为什么用left&nbsp;join14.&nbsp;还有什么其他join&nbsp;介绍下15.&nbsp;sql有哪几部分组成的,写sql时要注意什么?16.&nbsp;where过滤时重点关注哪些?17.&nbsp;如何创建索引,使where条件尽量命中索引?18.&nbsp;有哪些类型的索引?19.&nbsp;sql哪些写法可能导致走不了索引?20.&nbsp;你有用过java的多线程吗?21.&nbsp;处理runnble还有哪些方式可以创建线程?22.&nbsp;你用spring&nbsp;boot&nbsp;做什么?23.&nbsp;你的系统大概分几层,每层的作用?24.&nbsp;每层的上下游分别是什么?25.&nbsp;自学学习方法是什么(文档or视频),什么驱动去学习的?26.&nbsp;比如你拿到一个项目或需求,你如何判断你需要去学习哪些技能,这里涉及到你可能不知道你不知道的,如何解决?27.&nbsp;看开源的项目或框架你会去关注背后的原理吗?28.&nbsp;用出问题了怎么办?手撕leetcode22.&nbsp;括号生成29.&nbsp;你了解回溯算法吗?10.25:主管面:1.&nbsp;自我介绍2.&nbsp;项目介绍3.&nbsp;怎么防止超卖的4.&nbsp;qps怎么得出的5.&nbsp;如何判断有没有超卖?之后项目问题都省略吧反问&nbsp;加班,技术栈,导师。面完hr告知定级d2。下周走审批流程。技术面前的hr面要了d1平均的薪资,结果定级d2,薪资主管拍板给了d1平均,建议各位在前期多要点
查看49道真题和解析
点赞 评论 收藏
分享
2 22 评论
分享
牛客网
牛客企业服务