我的问题是要求我在树中使用value
返回节点的深度。
例如,如果我depth(root, 7, 0 [depth initially])
,则应返回2.
我的第一次尝试,我做了类似的事情
# 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,我不知道为什么
答案 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