网易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 };
原文地址:https://www.cnblogs.com/njczy2010/p/5726267.html