2 个节点之间的最长路径
2022-09-05 00:30:55
计算两个节点之间的最长路径。
路径位于拱门中。
方法的签名为:
public static int longestPath(Node n)
在下面的示例二叉树中,它是 4(通过 2-3-13-5-2)。
这就是我现在所拥有的,对于给定的树,它只返回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;
}
我知道我在某个地方错过了一个关键概念......当我试图跟踪执行流程时,我的大脑会发疯......
我说得对吗,通过找到根,它的左节点和右节点之间的最长路径,然后在它的左节点和右节点上递归,通过它们从上一个方法调用中传递最长的路径,最后(何时?)返回最长的路径,我不确定你如何返回它......