网易2016 实习研发工程师 [编程题]二叉树

传送门

有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。

给定二叉树的根节点root,请返回所求距离。

题解:

给每个节点编号(0 - total),用map记录每个节点的父节点

找出最大权值叶子节点 和 最小权值 叶子节点的编号

然后就是寻找最近公共祖先了

 1 /*
 2 struct TreeNode {
 3     int val;
 4     struct TreeNode *left;
 5     struct TreeNode *right;
 6     TreeNode(int x) :
 7             val(x), left(NULL), right(NULL) {
 8     }
 9 };*/
10
11 class Tree {
12 public:
13     int getDis(TreeNode* root) {
14         // write code here
15         if(root == NULL) return 0;
16         int ma = INT_MIN,mi = INT_MAX;
17         int mapos = -1, mipos = -1;
18         int total = 0;
19         map<int,int> parent;
20         parent[0] = -1;
21         dfs(root,0,total,parent,ma,mi,mapos,mipos);
22         int ans = 0;
23         while(mapos != mipos) {
24             if(mapos > mipos){
25                 mapos = parent[mapos];
26             }
27             else{
28                 mipos = parent[mipos];
29             }
30             ans ++;
31         }
32         return ans;
33     }
34
35     void dfs(TreeNode* root,int index,int &total,map<int,int> &parent,int &ma,int &mi,int &mapos,int &mipos) {
36         if(root == NULL) {
37             return;
38         }
39         if(root->left == NULL && root->right == NULL){
40             if(root->val < mi) {
41                 mi = root->val;
42                 mipos = index;
43             }
44             if(root->val > ma) {
45                 ma = root->val;
46                 mapos = index;
47             }
48             return;
49         }
50         if(root->left != NULL) {
51             total++;
52             parent[total] = index;
53             dfs(root->left,total,total,parent,ma,mi,mapos,mipos);
54         }
55         if(root->right != NULL) {
56             total++;
57             parent[total] = index;
58             dfs(root->right,total,total,parent,ma,mi,mapos,mipos);
59         }
60     }
61
62 };
时间: 2024-08-01 10:42:40

网易2016 实习研发工程师 [编程题]二叉树的相关文章

网易2016实习研发工程师编程题

牛客网上的题 1 比较重量 小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更重. 给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第二个元素为较轻的钻石的编号.最后给定之前的比较次数n.请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0.输入

比较重量 网易2016实习研发工程师编程题

题目: 小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更重. 给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第 二个元素为较轻的钻石的编号.最后给定之前的比较次数n.请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0.输入数据保证合 法,不

网易2016 实习研发工程师 [编程题]寻找第K大 and leetcode 215. Kth Largest Element in an Array

传送门 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2],5,3 返回:2 note: 注意手写快排的时候: while(i < j) { while(j > i && a[j] > a[left]) j--; while(i < j && a[i] <= a[left]) i++; if(i

寻找第K大 网易2016实习研发工程师编程题

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5,2,2],5,3 返回:2 投机取巧能通过: 1 class Finder { 2 public: 3 int findKth(vector<int> a, int n, int K) { 4 // write code here 5 sort(a.begin(), a.end()); 6 return

网易 2016 实习研发工程师 3道 编程题-2

有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离.二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离. 给定二叉树的根节点root,请返回所求距离. //import java.util.ArrayList;   //import java.util.HashMap;   //import java.util.Iterator;   //import java.util.LinkedList;   //imp

网易 2016 实习研发工程师 3道 编程题-1

小明陪小红去看钻石,他们从一堆钻石中随机抽取两颗并比较她们的重量.这些钻石的重量各不相同.在他们们比较了一段时间后,它们看中了两颗钻石g1和g2.现在请你根据之前比较的信息判断这两颗钻石的哪颗更重. 给定两颗钻石的编号g1,g2,编号从1开始,同时给定关系数组vector,其中元素为一些二元组,第一个元素为一次比较中较重的钻石的编号,第二个元素为较轻的钻石的编号.最后给定之前的比较次数n.请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法判断返回0.输入数据保证合法,不会有矛盾情况

求职 | 华为研发工程师编程题个人题解【C++】【Python】

华为研发工程师编程题[C++][Python][数学][数组][字符串] 问题1 有这样一道智力题:"某商店规定:三个空汽水瓶可以换一瓶汽水.小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?"答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子.然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板.如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝? 输入描述: 输入文件最多包

搜狐2016研发工程师编程题

1.[编程题]马戏团 搜狐员工小王最近利用假期在外地旅游,在某个小镇碰到一个马戏团表演,精彩的表演结束后发现团长正和大伙在帐篷前激烈讨论,小王打听了下了解到, 马戏团正打算出一个新节目“最高罗汉塔”,即马戏团员叠罗汉表演.考虑到安全因素,要求叠罗汉过程中,站在某个人肩上的人应该既比自己矮又比自己瘦,或相等. 团长想要本次节目中的罗汉塔叠的最高,由于人数众多,正在头疼如何安排人员的问题.小王觉得这个问题很简单,于是统计了参与最高罗汉塔表演的所有团员的身高体重,并且很快找到叠最高罗汉塔的人员序列.

网易 2016 实习研发project师 3道 编程题

1 比較重量 给定两颗钻石的编号g1,g2,编号从1開始.同一时候给定关系数组vector,当中元素为一些二元组.第一个元素为一次比較中较重的钻石的编号,第二个元素为较轻的钻石的编号.最后给定之前的比較次数n. 请返回这两颗钻石的关系,若g1更重返回1,g2更重返回-1,无法推断返回0. 输入数据保证合法,不会有矛盾情况出现. 測试例子: 2,3,[[1,2],[2,4],[1,3],[4,3]],4 返回: 1 class Cmp { public: int cmp(int g1, int g