如何计算数字树符合谓词的数字树?

时间:2014-11-23 01:57:18

标签: python python-3.x recursion tree

我正在尝试定义一个count函数,它计算树中满足谓词的每个数字。

#given function:
class TN:
    def __init__(self,value,left=None,right=None):
        self.value = value
        self.left  = left
        self.right = right

def add(atree,value):
    if atree == None:
       return TN(value)
    if value < atree.value:
       atree.left = add(atree.left,value)
       return atree
    elif value > atree.value:
       atree.right = add(atree.right,value)
       return atree
    else:
       return atree  # already in tree

def add_all(atree,values):
    for v in values:
        atree = add(atree,v)
    return atree

def is_prime (x):
    assert type(x) is int and x >= 0, 'predicate.is_prime x is not a positive int: '+str(x)
    if x <= 2:
       return x == 2
    for i in range(2,x):
       if x % i == 0:
          return False
    return True

add_all函数获取一个列表并返回一个树。 如果int参数是prime,则is_prime函数返回True。

#function I am trying to define (a recursive function: count):
def count(t,p):
    if t==None:
       return 0
    else:
       return 1+count((t.left if p(t.left.value) else t.right),p)

例如,

import random
values = [i for i in range(1,200)]
random.shuffle(values

)     ###调用count函数如下应该给我:     count(add_all(None,values),is_prime)# - &gt; 46

我的计数功能给了我:

AttributeError: 'NoneType' object has no attribute 'value'

我是新手使用树,我认为我有定义递归计数功能的问题。

1 个答案:

答案 0 :(得分:1)

至少有一个t.left属性为None。这是合情合理的,二叉树不会永远存在。

但是,如果要计算与谓词匹配的所有值,则必须遍历所有这些元素,而不仅仅是那些与谓词匹配的元素。始终遍历节点,但仅返回匹配的节点的计数:

def count(t, p):
    if t is None:
       return 0
    result = 1 if p(t.value) else 0
    return count(t.left, p) + result + count(t.right, p)

E.g。返回当前节点的计数(0或1)加上左右节点的递归计数。如果其中任何一个是None,那么递归函数将停止并返回0

你甚至可以使用:

def count(t, p):
    if t is None:
       return 0
    return count(t.left, p) + p(t.value) + count(t.right, p)

因为在Python中,布尔类型是int的子类,其中True == 1False == 0;求和整数和布尔值将布尔值视为整数:

>>> 0 + True
1