更好的方法来查找树中节点的深度

时间:2014-01-04 04:03:21

标签: java tree depth

我想计算树的深度 我在下面写了代码

我的问题是:

  1. 这段代码的顺序是什么?是O(n)[n是树节点数]
  2. 您认为还有其他更好更快的方法吗?
  3. 提前致谢

    public int height(Node n)
    {
        if(n == null)
            return 0;
        return 1 + Math.max(height(n.left), height(n.right));
    
    }
    

4 个答案:

答案 0 :(得分:3)

它是O(n),无论您拥有什么类型的树,因为您访问每个节点以确定最大深度。

唯一更有效的方法是在某处存储有关树的额外信息。如果它是平衡的,则根据节点数知道最大高度。

或者,您可以缓存信息。有两个额外变量depthdirty,最初将dirty设置为true:

  • 当来电者请求深度且dirty为真时,请调用您的函数将其解析,但将商店调入depth并将dirty设置为false。
  • 当来电者请求深度且dirty为假时,只需返回depth
  • 每当更改树的结构(插入或删除节点)时,将dirty设置为true。

答案 1 :(得分:1)

你的功能顺序是O(n)。

在创建时将高度存储在每个节点中,并在添加,删除和平衡树时保持该高度。

答案 2 :(得分:1)

好吧,我看到你的问题要求深度,代码就是找到节点的高度。

我不确定,你想要什么样的高度或深度。如果您需要深度代码,则不是这样。见下文:

Depth (n) = 1 + Depth(P(n)) 

是深度的递归定义。

对于身高,你写的是正确的。

检查Tree Operations,我已经为树上的大多数操作编写了渐近分析

答案 3 :(得分:0)

  1. 是的,您的代码是O(n),因为在最坏的情况下,您在根节点上调用高度(然后您必须触摸每个节点以找到到叶子的最长路径)。
  2. TTS的代码与您的代码相同,我认为没有更快的方法。