使用递归查找树中特定节点的深度

时间:2018-05-22 06:41:32

标签: python recursion

我目前正在尝试解决一个问题,即我返回树中出现的数字的最大深度。例如,如果树看起来像这样:

public class Factory {
    private static Singleton instance = new Singleton();
    public static Singleton getInstance() {
        return res;
    }
}

我的函数应该返回2.但是,我的函数返回0

// Correct lazy initialization in Java
class Foo {
    private static class HelperHolder {
       public static final Helper helper = new Helper();
    }

    public static Helper getHelper() {
        return HelperHolder.helper;
    }
}

我的思维过程错了吗?如果当前值与我正在寻找的值(参数)匹配,我应该添加 1 / \ 2 3 \ 2 ,如果它们不匹配,则不添加def max_depth(t,value): if t == None: return -1 left = max_depth(t.left, value) right = max_depth(t.right, value) if t.value == value: return 1 + max(left,right) else: return max(left,right) 。我使用1因此它返回左子项或右项的最大值,因此我得到具有更高深度的子项。这是错的吗?

这是树类:

1

这是我对树的构造:

max()

这将打印class TN: def __init__(self,value,left=None,right=None): self.value = value self.left = left self.right = right

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您尝试解决的问题是:树中值value的最大深度是什么。

您应该在t.value == value时增加不仅,而且当树的任何后代与您正在寻找的值匹配时。这是因为您正在测量深度。

以下是算法的外观:

def max_depth(t,value):
    if t == None:
        return -1
    left = max_depth(t.left, value)
    right = max_depth(t.right, value)
    if t.value == value or left > -1 or right > -1: # <<<<
        return 1 + max(left,right)
    else:
        return max(left,right) # This is always -1

答案 1 :(得分:0)

我认为这是max_depth

的一个很好的编码

我们添加了一个额外的参数d,其默认值为0。此参数用于跟踪当前深度。在返回答案时,我们仅在d节点max (d, ...)匹配时在t中添加left - 否则,我们会返回rightdef max_depth (t, value, d = 0): if t is None: return -1 elif t.value == value: return max ( d , max_depth (t.left, value, d + 1) , max_depth (t.right, value, d + 1) ) else: return max ( max_depth (t.left, value, d + 1) , max_depth (t.right, value, d + 1) ) 的最大值结果

tree = \
  TN (1, TN (2), TN (3, right = TN (2)))

这是您问题代码中的树

print (max_depth (tree, 1))
# 0

print (max_depth (tree, 2))
# 2

print (max_depth (tree, 3))
# 1

找出每个值的最大深度

-1

如果找不到值,将返回print (max_depth (tree, 4)) # -1

<a>