每个节点到BST中叶子的最长路径

时间:2016-03-31 03:35:06

标签: algorithm data-structures

对于BST中的每个节点,从节点到叶子的最长路径的长度是多少? (最糟糕的情况) 我认为在最坏的情况下,我们有一个从节点到叶子的线性路径。如果树中有n个节点,则运行时间为O(n * n)。这是对的吗?

3 个答案:

答案 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

所述

返回最高两个高度