二叉树Python中的叶子数

时间:2015-02-26 01:04:40

标签: python binary-tree

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

4 个答案:

答案 0 :(得分:0)

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')]

答案 1 :(得分:0)

您可以使用递归函数:

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

请注意,您必须防范类似字符串的内容。因为否则你最终会计算叶子节点的字母数。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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