对于BST中的每个节点,从节点到叶子的最长路径的长度是多少? (最糟糕的情况) 我认为在最坏的情况下,我们有一个从节点到叶子的线性路径。如果树中有n个节点,则运行时间为O(n * n)。这是对的吗?
答案 0 :(得分:0)
您可以在线性时间内执行此操作,假设它是“每个叶子的给定节点”或“给定叶子的每个节点”。如果它是“每个节点到每个叶子”,那就更难了。
要做到这一点:从“目标”走到根,按距离标记每个节点;所有这些节点的颜色都是红色(因此,根保持目标的深度,目标保持0)。对于每个红色节点,走它的非红色子节点,从下降时加1,从红色节点的值开始。
这不是O(n * n),因为你可以重复使用你的很多工作;你没有找到一条路径,然后完全开始寻找下一条路径。
答案 1 :(得分:0)
从节点到叶子的最长路径是
1.一直从节点到根目录
然后从根部向下到最深的叶子
3.确保不会两次遍历一个节点,因为如果允许的话,可以通过多次在任意两个节点之间进行无限长的路径
x
/ \
b a
\
c
\
d
从c到叶子的最长路径会做两件事
1。从c到x(计算这个长度)
2。从x到最深的叶子,其路径中没有c(在这种情况下,叶子是b)
以下代码的时间复杂度为O(n),用于查找距单个节点的最长距离 因此,找到所有节点的距离将是O(n ^ 2)
public int longestPath(Node n, Node root) {
int path = 0;
Node x = n;
while (x.parent != null) {
x = x.parent;
path++;
}
int height = maxHeight(root, n);
return path + height;
}
private int maxHeight(Node x, Node exclude) {
if (x == exclude)
return -1;
if (x == null)
return -1;
if (x.left == null && x.right == null)
return 0;
int l = maxHeight(x.left, exclude);
int r = maxHeight(x.right, exclude);
return l > r ? l + 1 : r + 1;
}
答案 2 :(得分:0)
我的解决方案是。
1)检查节点是否有子树,如果是,则找到该子树的高度。
2)找到树的其余部分的高度,如@abhaybhatia
所述返回最高两个高度