在二进制搜索树中,我应该如何计算只有一个孩子的节点?
def one_child_count(self):
node = self._root
count = self.one_child_count_aux(node)
return count
def one_child_count_aux(self,node):
count = 0
if node :
if node._left is not None and node._right is None:
count += 1
if node._right is not None and node._left is None:
count += 1
else:
if node._left:
count += self.leaf_count_aux(node._left)
if node._right:
count += self.leaf_count_aux(node._right)
return count
我不知道我在做什么错。当我尝试运行代码并插入时:
bst.insert(37)
bst.insert(12)
树就像:
37
/
12
它应该返回1但我得到2。请帮我更正我的代码。
答案 0 :(得分:0)
如果您仍在使用递归,则可以使用常规递归函数,该函数将计入一个或两个子节点。
def count_nodes(bst):
def count_nodes2(node):
if node is None:
return 0
return 1 + count_nodes2(node._left) + count_nodes2(node._right)
return count_nodes2(bst._root)
答案 1 :(得分:0)
您的代码有两个 问题:首先,在使用if
的{{1}}语句中存在逻辑错误;其次,您要调用未显示的函数else
,使其不递归,而不是递归调用leaf_count_aux()
。我的猜测是您想要更多类似的东西:
one_child_count_aux()
答案 2 :(得分:-1)
您可以使用Transaction
获得更简洁的递归函数:
getattr
输出:
class Tree:
def __init__(self, **kwargs):
self.__dict__ = {i:kwargs.get(i) for i in ['val', '_left', '_right']}
def count_nodes(self):
yield 1
yield from getattr(self._left, 'count_nodes', lambda :[])()
yield from getattr(self._right, 'count_nodes', lambda :[])()
t = Tree(_left = Tree(val = 12), val = 37)
result = sum(t.count_nodes())