我对编程很新,我想要使用一些二进制搜索树。我想创建一个以递归方式计算树中节点数的函数,但是,当我运行我的函数时,它似乎不起作用并且它一直返回'none',好像我的树中没有任何东西。有人能帮我解决这个问题吗?
这是我的TreeNode类:
class TreeNode(object):
def __init__(self, data = None, left=None, right=None):
self.item = data
self.left = left
self.right = right
def __str__(self):
return str(self.item)
这是我的主要功能,我将大部分功能调整下来,以便我们可以解决有关节点计数的问题。
from TreeNode import TreeNode
class BST(object):
#------------------------------------------------------------
def __init__(self):
"""create empty binary search tree
post: empty tree created"""
self.root = None
def treeSize(self, root, size = 0):
if root is None:
return -1
if root is not None:
size += 1
if root.left is not None:
self.treeSize(root.left, size)
if root.right is not None:
self.treeSize(root.right, size)
这是我用来测试我的功能的代码:
from BinarySearchTree import BST
from TreeNode import TreeNode
tree = TreeNode(4, TreeNode(2, TreeNode(1), TreeNode(3)), TreeNode (7, TreeNode(6),TreeNode(8)))
a = BST()
print(a.postOrder(tree))
print(a.treeSize(tree))
当我调用'print(a.treeSize(tree))时,它只返回'none'而不是'7',就像它应该的那样。
答案 0 :(得分:8)
您也可以使用旧的递归方式:
def treeSize(self, root):
if root is None:
return 0
if root is not None:
return 1 + self.treeSize(root.left) + self.treeSize(root.right)
乔纳森的回答也很好。
答案 1 :(得分:2)
我明白了。您认为大小将在被调用函数中更新。它不会因为它是每个功能的本地而不是。您可以在其上调用global
,但这不是最佳的。
您可以将其设置为成员变量(实际上不是这样做的):
def __init__(self):
...
self.size = 0
def treeSize(self,...):
...
self.size += 1
...
return self.size
但显而易见的错误是每次调用treeSize时self.size都会加倍。您也可以解决这个问题,但让我们使用我们熟悉和喜爱的模式。像VHarisop写的那样,这是一个很好的旧递归方式。