使用值二进制搜索树返回特定节点的深度

时间:2017-04-12 01:49:40

标签: python recursion tree binary-search-tree nodes

我的问题是要求我在树中使用value返回节点的深度。

例如,如果我depth(root, 7, 0 [depth initially]),则应返回2.

enter image description here

我的第一次尝试,我做了类似的事情

# value is the value wanted, count measures the 'depth'

def depth(root, value, count):

    # if we are not at a empty node
    if root != None:
        # if we found our data, then just return the count (depth)
        if root.data == value:
            return count


        # otherwise increase count, and traverse both sides
        else:
            count += 1
            count = depth(root.left, value, count)
            count = depth(root.right, value, count)


    return count

当我跑这个但是我得到深度= 6,我不知道为什么

2 个答案:

答案 0 :(得分:0)

你应该在你的分支的第二部分回来。

假设您未在root中找到目标值。然后将count设置为搜索左边的结果。然后将count设置为向左搜索的结果(再次)。

你永远不会正确搜索,无论你是否找到了目标,你都会返回计数(在失去if之后)。

更好的方法是:

if you match the target:
    return count
else:
    search on the left side.
    if that is not None, return it.
    search on the right side.
    regardless of whether it's None or not, return it.

现在,您的返回值将为None,意味着“无法找到目标”,或者在找到目标时为count

答案 1 :(得分:0)

为什么count在您回来的路上count时可能会出现问题:

def depth(root, value):
    # if we are at a empty node return infinity
    if not root:
        return float('inf')

    # if we found our data, then just return 0
    if root.data == value:
        return 0
    # otherwise traverse both sides
    return 1 + min(depth(root.left, value), depth(root.right, value))

要摆脱min(),你可以return None作为你的终端案例然后实施检查,但它很丑陋而不是惯用语:

def depth(root, value):
    # if we are at a empty node return None
    if not root:
        return None

    # if we found our data, then just return 0
    if root.data == value:
        return 0

    # otherwise, traverse both sides
    c = depth(root.left, value)
    if c is None:
        c = depth(root.right, value)
        if c is None:
            return None
    return c + 1

或者将其实现为BFS

def depth(root, value):
    q = [(root, 0)]
    while q:
        node, depth = q.pop(0)
        if node.data == value:
            return depth
        depth += 1
        if node.left:
            q.append((node.left, depth))
        if node.right:
            q.append((node.right, depth))
    return None