题解 | #异或传递#

异或传递

http://www.nowcoder.com/questionTerminal/381e77b430754b4faee2a83d6b9fe10d

牛客不保存代码,记录一下。

常规的暴力解法:

  1. 处理op数组,将[[3,2],[1,4],[1,3],[4,2],[2,1]]中[1,4],[1,3]这种情况合并为[1,7],这里合不合并都一样,是性能的问题。
  2. 遍历,将每个节点的值设置为0,同时用map<int, TreeNode*>保存节点的编号,map的好处就是通过节点标号找之前的地址比较方便(这里的遍历顺序无所谓,用了层序遍历是复习一下,用其他遍历代码会更少,处理起来也更优雅)
  3. 逐个处理op数组
class Solution {
public:
	void travel(TreeNode* root, int value) {
		if (root == nullptr)
			return;
		root->val ^= value;
		travel(root->left, value);
		travel(root->right, value);
	}
  
	TreeNode* xorTree(TreeNode* root, vector<vector<int> >& op) {
		if (root == nullptr)
			return root;
      
		//part1: 合并op数组
      	map<int, int> mp;		//[节点编号,亦或的值]
		for (auto vec : op)
			mp[vec[0]] = (mp[vec[0]] ^ vec[1]);
      
		//part2: 层序遍历处理树节点
      	queue<TreeNode*> que;
		que.push(root);
		map<int, TreeNode*> tree;//[节点编号,节点的指针]
		while (!que.empty()) {
			int size = que.size();
			for (int i = 0; i < size; ++i) {
				TreeNode* node = que.front();
				tree[node->val] = node;
				node->val = 0;
				que.pop();
				if (node->left) que.push(node->left);
				if (node->right) que.push(node->right);
			}
		}
      
      	//part3: 遍历op数组,处理每个节点及其子树
		for (auto m : mp) {
			// m.first; 代表节点编号, m.second;代表亦或的值
			travel(tree[m.first], m.second);
		}
		return root;
	}
};
全部评论

相关推荐

今天周一休息,突发奇想写一篇阶段总结。如题,我已经去了一个和Java彻底毫无关联的行业。曾经我以为自己能在计算机行业发光发热,没想到刚入行一年多就当了逃兵。从最开始的热爱到现在一看到代码就厌恶,不知道自己经历了什么。所以我去干什么了?答案是:在成都当了租房销售。上班那会压力大了就念叨着去干租房中介,但是一直下不去这个决心,想着自己学了四年多的计算机知识,终究还是不甘心。终于在某一天准备八股文的时候,看着无数篇和工作内容关系不大的理论知识,那一刻下定决心,决定尝试一下销售行业,也算是给自己一个交代。后面阴差阳错的投了成都自如去当租房管家,没想到面试很顺利,在当天一百多个面试的人里面,我成为了为数不多通过的几个幸运儿之一。目前已经培训通过,正式入职,也开了单,也有压力但是每天过得很开心,真心喜欢那种和人交流的感觉,哪怕是最后没有选择找我租房。说这些也是想告诉那些大三,大四正在找Java实习而焦虑的同学:你们现在还年轻,选择很多,容错率也很高,可以尽情去尝试自己喜欢的行业和工作。不用因为某一次的面试没通过或者简历石沉大海而焦虑,更不用因为身边人都在挤编程的独木桥就强迫自己跟风。也算是自己的碎碎念吧,也希望自己能在新的领域取得一点小成就。也祝牛油工作顺利!
沉淀小子:干啥都不丢人啊,生存是必须要的,销售很考验一个人综合素质能力的,好的销售人脉和资源可不比写字楼的白领差啊
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务