在二叉搜索树中计算只有一个孩子的节点?

时间:2018-07-11 15:47:28

标签: python recursion binary-search-tree

在二进制搜索树中,我应该如何计算只有一个孩子的节点?

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。请帮我更正我的代码。

3 个答案:

答案 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())