主类树
class Tree:
def __init__(self, root, size):
self.root = None
self.size = 0
def count_nodes(self):
if self.value is None:
return -1
else:
return 1 + self.count_nodes(self.left) + self.count_nodes(self.right)
#self.size += 1
#if self.left is not None:
#self.left.count_nodes()
#if self.right is not None:
#self.right.count_nodes()
#return self.size
带有子类Node和Leaf
class Node (Tree):
def __init__(self, value, left, right):
self.left = left
self.right = right
self.value = value
class Leaf (Tree):
def __init__(self, value):
self.value = value
遇到Leaf时该怎么办?我尝试了上面两种方法,但仍然不知道在遇到叶子时如何处理。
示例树将如下,tree.count-nodes()
应返回7
tree = Node ("one",
Node ("two", Leaf ("three"), Leaf ("four")),
Node ("five", Leaf ("six"), Leaf ("seven")))
答案 0 :(得分:0)
您的方法是正确的 - 二叉树中的节点数等于 1(根节点) + nodes_in_left_subtree(如果存在) + nodes_in_right_subtree (如果存在)。这是递归定义,可以像你尝试的那样实现为递归函数。
在您的实施中,您有一些缺陷:
self.left
和self.right
实际上是Tree
,您应该致电这些call_nodes
上的Tree
而不是self
P.S。您的代码在语法上不正确。支票self.value is None
对我来说很奇怪,但对于您的问题域可能也是如此。永远不会使用root
变量。您可以考虑当前数据组织是否确实需要它。
答案 1 :(得分:0)
不需要另一个子类来计算叶子。您可以像这样统计所有节点:
class Tree:
def __init__(self, root, size):
self.root = None
self.size = 0
def count_nodes(self,root):
if (root.right is None and root.left is None) :
return -1
else:
return 1 + self.count_nodes(self.left) + self.count_nodes(self.right)