Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何计算二叉树的叶子数?_Python_Python 3.x - Fatal编程技术网

Python 如何计算二叉树的叶子数?

Python 如何计算二叉树的叶子数?,python,python-3.x,Python,Python 3.x,我遇到了一个递归错误,我能解决这个问题吗?有人能给我解释一下如何计算二叉树的叶子吗?计算叶子时,你总是从self节点重复 def count_leaves(self): ptr = self.root counter = 0 if ptr.left is None and ptr.right is None: counter += 1 if ptr.left: counter += s

我遇到了一个递归错误,我能解决这个问题吗?有人能给我解释一下如何计算二叉树的叶子吗?

计算叶子时,你总是从self节点重复

def count_leaves(self):
        ptr = self.root
        counter = 0
        if ptr.left is None and ptr.right is None:
            counter += 1
        if ptr.left:
            counter += self.count_leaves()
        if ptr.right:
            counter += self.count_leaves()
        return counter
第二个问题似乎与如何添加节点有关

比如说,

def count_leaves(self):
    ptr = self.root  # reseting at the root
    ...
    counter += self.count_leaves()  # recurses from the top of the tree
所以,基本上ptr.left=ptr.left,在ptr!=没有

您需要向下迭代。我通常在节点类上实现所有递归方法,而不是在树类中传递指针

def recurse_add(self, ptr, item):
    if prt == None:
        # say this is false
    ptr.left = self.recurse_add(ptr.left, item)
    ...
    return ptr  # The recursive call will return 'ptr.left'

提高递归限制sys.setrecursionlimit,或者不使用递归。您是如何得到此错误的?我们无法看到您的树或您调用函数的位置。我不确定您的BST类从节点继承是否有意义。一棵树有一个根节点,但你永远不会说一棵树本身就是一个节点。@cricket\u 007它应该返回一个计数器变量,我用一个字符串测试这个函数,例如>>>“叶数是”,counter@Blckknght就这么走了谢谢。很好,那么您的一个节点正在循环回自身。因为我们看不到你是怎么造树的,所以很难说
def recurse_add(self, ptr, item):
    if prt == None:
        # say this is false
    ptr.left = self.recurse_add(ptr.left, item)
    ...
    return ptr  # The recursive call will return 'ptr.left'
class Node(object):
    def __init__(self, item, left = None, right = None):
        self.item = item
        self.left = left
        self.right = right

    def is_leaf(self):
        return self.right is None and self.left is None

    def add(self, item):
        if item <= self.item:
            self.left = Node(item) if self.left is None else self.left.add(item)
        elif item > self.item:
            self.right = Node(item) if self.right is None else self.right.add(item)
        return self

    def count_leaves(self):
        counter = 0
        if self.is_leaf():
            counter += 1
        if self.left is not None:
            counter += self.left.count_leaves()
        if self.right is not None:
            counter += self.right.count_leaves()
        return counter
class BST:

    def __init__(self):
        self.root = None

    def is_empty(self):
        return self.root is None

    def add(self, item):
        if self.is_empty():
            self.root = Node(item)
        else:
            self.root.add(item)

    def count_leaves(self):
        return 0 if self.is_empty() else self.root.count_leaves()