树中最长路径(2011微软实习生笔试题)

今天(十号)有微软的实习生考试,不知是因为简历写得太差了,还是因为那些个表格中空得太多了,也有可能是因为简历投得太晚了(八号中午截止,我七号晚上十一点多才投),总之就是我被刷了。(其实并没有被刷,是因为自己投得太晚了,后来参加了第二批笔试,考得还行,等了很长时间没有回复,以为没戏了,期末的时候动了手术,从手术台上下来的第二天他们就打电话通知我面试了,着实惊喜了我,当时的情况也不可能进行什么电面或者on-site,出院后一个礼拜左右,没想到他们又打过来了,当时就进行了电面,后面要求我进行英语自我介绍,我实在对自己的口语不自信,直接推掉了。进微软是我的梦想,该想些办法练练口语了)

宿舍有同学参加了考试,傍晚回来的时候,问了下考试的状况:
共十一道题,十道选择题(50分钟后上交),一道大题主要就是考察quick sort(也是50分钟,如果记得quick sort,时间应该算是非常宽裕了),内容几乎全是数据结构和算法之类。
选择题第一道题大意是(这道题感觉很熟悉,貌似之前什么时候看到过):
二叉树,各边有不同权值,求一路径,使得两点之间路径的所有边的权重之和最大,路径中边不重复,问复杂度多少?
我一开始以为就是求关键路径,其实不是的,求关键路径时会告诉你起点和终点。
思考了一会儿,其实O(n)就够了:
从叶子节点开始,找到每个结点的经过它能得到的最长路径和它的最长分支,
    (node1)
  e1/         \e2
  (node2)    (node3)
很明显,经过node1的最长路径为node2和node3的最长分支之和再加上两条边(e1和e2)的长度

代码如下:
(该方法实际上不只支持二叉树,
   注意:node.getLength()返回的是从node结点的父结点到node结点的边的长度,
   以上如为例,node3.getLength()返回的是e2的长度。
   全局变量longestPath用来记录当前知的最长路径。

public static void cal(MSTreeNode node) {
List<MSTreeNode> children = node.getChildren();
int fstl = 0, scndl = 0;
for (int i = 0; i < children.size(); i++) {
cal(node.getChildren().get(i));
int tmp = node.getChildren().get(i).longestBranch
+ node.getChildren().get(i).getLength();
if (fstl < tmp) {
scndl = fstl;
fstl = tmp;
} else if (scndl < tmp) {
scndl = tmp;
}
}
node.longestBranch = fstl;
node.longestPath = fstl + scndl;
System.out.println("lb:" + node.longestBranch + "\tlp:"
+ node.longestPath);
longestPath = Math.max(longestPath, node.longestPath);
}

 

posted @ 2011-04-10 21:17  之人  阅读(1735)  评论(5编辑  收藏  举报