二叉树中的叶子数 Python

Number of Leaves in a Binary Tree Python

我有一个看起来像这样的数据结构 Q = (A,(B,C))。 Len(Q) 显然等于 2。但我只关心叶子 (A, B, C)。我可以使用什么函数 return function(Q) = 3?

def count_nodes(tree):
    if not tree:
        return 0
    elif type(tree) == str:
        return 1
    else:
        return count_nodes(tree[0]) + count_nodes(tree[1:])


tree = ('a', ('b', ('d', 'e'), 'c', ('f', 'g')))
print count_nodes(tree) # prints 7

也就是说,如果您真正想要的是树叶(在您的示例中:(B,C)),您可以将其转换为字符串,使用正则表达式,然后还原:

import re

tree = ('a', ('b', ('d', 'e'), 'c', ('f', 'g')))
res = re.findall(r'\([^(]+?\)', str(tree))
res = map(eval, res)
print res # [('d', 'e'), ('f', 'g')]

你可以使用递归函数:

def rec_len(thing):
    if isinstance(thing, basestring):
        return 1
    try: 
        return sum(rec_len(x) for x in thing)
    except TypeError:
        return 1

请注意,您必须提防 'string-like' 的内容,否则您最终会计算叶节点的字母。

def flatten(container):
    for i in container:
        if isinstance(i, list) or isinstance(i, tuple):
            for j in flatten(i):
               yield j
        else:
            yield i

sum(1 for _ in flatten(Q))
def flatten(q):
    if not q:
        return 0
    if isinstance(q, tuple):
        if not isinstance(q[0], tuple):
            return 1+flatten(q[1:])
        else:
            return flatten(q[0]) + flatten(q[1:])
    else:
        return 1