【问题标题】:Counting the nodes in a Binary Search Tree in Python在 Python 中计算二叉搜索树中的节点
【发布时间】:2015-03-30 22:12:45
【问题描述】:

我对编程还很陌生,我想搞砸一些二叉搜索树。我想创建一个递归计算树中节点数的函数,但是,当我运行我的函数时,它似乎不起作用,并且它一直返回“无”,就好像我的树中没有任何内容一样。谁能帮我找到这里的问题?

这是我的 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'。

【问题讨论】:

    标签: python binary-tree binary-search-tree


    【解决方案1】:

    你也可以用旧的递归方式来做:

    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)
    

    乔纳森的回答也很好。

    【讨论】:

      【解决方案2】:

      我明白了。你认为 size 会在被调用的函数中更新。它不会因为它是每个函数的本地函数。你可以打电话给global,但这不是最佳选择。

      您可以将其设置为成员变量(实际上不要这样做):

      def __init__(self):
         ...
         self.size = 0
      
      def treeSize(self,...):
         ...
         self.size += 1
         ...
         return self.size
      

      但明显的错误是 self.size 每次调用 treeSize 时都会加倍。你也可以解决这个问题,但让我们使用我们熟悉和喜爱的模式。像 VHarisop 写的那样,用老式的递归方式来做。

      【讨论】:

      • 是的,现在可以使用了!非常感谢!我不敢相信我忘记将 self.size 添加到我的函数中。你是最棒的!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-23
      • 2020-08-07
      • 2014-05-10
      • 2015-05-14
      • 1970-01-01
      • 2016-01-31
      相关资源
      最近更新 更多