用叶子计算二叉树中的节点数

时间:2016-03-28 15:02:38

标签: python algorithm binary-tree

主类树

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")))

2 个答案:

答案 0 :(得分:0)

您的方法是正确的 - 二叉树中的节点数等于 1(根节点) + nodes_in_left_subtree(如果存在) + nodes_in_right_subtree (如果存在)。这是递归定义,可以像你尝试的那样实现为递归函数。

在您的实施中,您有一些缺陷:

  • 您没有检查子树是否确实存在
  • self.leftself.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)