python - 计算二叉树中的节点数

时间:2017-10-22 08:32:23

标签: python python-3.6

我试图编写一个使用递归来查找节点数的函数,即二叉树的大小。如果树为空,则没有节点。如果它不为空,则节点数为1(根)加上左子树的节点数和右子树的节点数。

我打算使用给我的二叉树类来做这件事。

这是我的Binary Tree类:

class BinaryTree:

    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

    def insert_left(self, new_data):
        if self.left == None:
            self.left = BinaryTree(new_data)
        else:
            t = BinaryTree(new_data)
            t.left = self.left
            self.left = t

    def insert_right(self, new_data):
        if self.right == None:
            self.right = BinaryTree(new_data)
        else:
            t = BinaryTree(new_data)
            t.right = self.right
            self.right = t

    def get_left(self):
        return self.left


    def get_right(self):
        return self.right

    def set_data(self, data):
        self.data = data

    def get_data(self):
        return self.data

这是我计算大小的递归函数:

def size(my_tree):
    count = 0
    if my_tree.get_data() is None:
        return 0
    else:
        count += 1 + size(my_tree.get_left()) + size(my_tree.get_right())
    return count

然而,当我用这个程序运行它时:

 a = BinaryTree(1)
 a.insert_left(2)
 a.insert_right(3)
 print(size(a))

我收到以下错误:

Original exception was:
Traceback (most recent call last):
    File "prog.python3", line 57, in <module>
        print(size(a))
    File "prog.python3", line 41, in size
        count += 1 + size(my_tree.get_left()) + size(my_tree.get_right())
    File "prog.python3", line 38, in size
        if my_tree.get_data() is None:
AttributeError: 'NoneType' object has no attribute 'get_data'

输出时应为:

3

我根本不理解我做错了什么,但我很确定它必须与if语句有关。

4 个答案:

答案 0 :(得分:1)

只需将您的if声明修改为

即可
if my_tree is None:
    return 0

由于您尝试在递归调用二叉树的叶节点时访问get_data数据对象的NULL属性,因此出现错误。

相反,当您到达return 0节点时,您实际需要做的是NoneType

答案 1 :(得分:0)

如果my_tree为无,会发生什么?然后,您无法拨打get_data() ...

试试这个

if my_tree is None:
    return 0

值得指出的是,您并不关心节点数据以查找树的大小

更优化的方法是不递归,并在插入/删除元素时保持大小更新

答案 2 :(得分:0)

假设您传入了一个有效的root对象,并且按预期发生了递归,那么您可以在什么时候遇到NoneType错误?当然,当my_treeNone时,您尝试访问None的属性。什么时候my_tree可以None?在树叶。换句话说,您的基本案例格式不正确。

请注意,测试get_data的返回值在这里完全是多余的,因为self.data与节点的高度或节点本身无关。

def size(my_tree):
    if not my_tree:
        return 0

    return 1 + size(my_tree.get_left()) + size(my_tree.get_right())

进一步的挑剔:

  • 您不需要else;这是控制流程所暗示的。
  • 您不需要额外的变量来存储计数,因为除return之外您不做任何其他操作。

答案 3 :(得分:0)

您收到此错误是因为您在不存在的对象上调用get_data()。因此,您在NoneType对象上调用 get_data()

def size(my_tree):
    count = 0
    if my_tree is None:
        return 0
    count += 1 + size(my_tree.get_left()) + size(my_tree.get_right())
    return count

不需要else子句。计算二叉树节点的另一个建议是在类上有一个属性size,并在从树中添加/删除项目时增加/减少它。

相关问题