计算两个节点之间的最长路径。
该路径是一个弧形路径。
方法的签名为:
public static int longestPath(Node n)
在下面的示例二叉树中,路径是通过2-3-13-5-2得到的,其中节点4位于路径上。
这是我现在拥有的代码,但对于给定的树它只返回0。
public static int longestPath(Node n) {
if (n != null) {
longestPath(n, 0);
}
return 0;
}
private static int longestPath(Node n, int prevNodePath) {
if (n != null && n.getLeftSon() != null && n.getRightSon() != null) {
int currNodePath = countLeftNodes(n.getLeftSon()) + countRightNodes(n.getRightSon());
int leftLongestPath = countLeftNodes(n.getLeftSon().getLeftSon()) + countRightNodes(n.getLeftSon().getRightSon());
int rightLongestPath = countLeftNodes(n.getRightSon().getLeftSon()) + countRightNodes(n.getRightSon().getRightSon());
int longestPath = currNodePath > leftLongestPath ? currNodePath : leftLongestPath;
longestPath = longestPath > rightLongestPath ? longestPath : rightLongestPath;
longestPath(n.getLeftSon(), longestPath);
longestPath(n.getRightSon(), longestPath);
return longestPath > prevNodePath ? longestPath : prevNodePath;
}
return 0;
}
private static int countLeftNodes(Node n) {
if (n != null) {
return 1+ countLeftNodes(n.getLeftSon());
}
return 0;
}
private static int countRightNodes(Node n) {
if (n != null) {
return 1+ countRightNodes(n.getRightSon());
}
return 0;
}
我明白我在某个关键概念上有所缺失... 当我尝试追踪执行流程时,我的大脑变得混乱起来...
我是否正确地说,通过找到根节点、它的左右节点之间的最长路径,然后在左右节点上递归并传递前一个方法调用中的最长路径,最后(何时?)返回最长路径,但我不确定如何返回它...