二叉树:列表到节点列表和带递归的引用

时间:2015-03-04 21:08:10

标签: python list recursion binary-tree

我一直在尝试将列表格式列表转换为由节点和引用组成的二叉树对象。到目前为止,我有3个案例,其中左右节点为空,左边为空,右边为空。问题是每当我测试我的函数时,递归都不起作用。我的意思是递归深度只有一个级别才能返回转换后的二叉树。

argument =  ['a', ['b', ['d', None, None],['f', None, None]], ['c', None, ['h', None, None]]]

def linkedlisttobinarytree (l):
    '''
    list of lists -> (nodes and references)
    Takes a list of lists and returns a binary tree in nodes and references form
    '''
    bt = BinaryTree(l[0])
    if (l[1] and l[2]) == None:
        return bt.getRootValue()
    elif l[1] != None and l[2] == None:
        bt.left = ll2nr(l[1])
    elif l[2] != None and l[1] == None:
        bt.right = ll2nr(l[2])
    return bt

例如,当我发送变量'参数'在我的方法中,它只会产生' a'作为根节点且只有' a',该方法仅转换'参数'中的第一个元素。有人可以澄清为什么我的递归深度如此之浅?

2 个答案:

答案 0 :(得分:0)

我认为这是因为当l [1]和l [2]不是没有时你没有定义动作。因此,当您将参数传递给函数时,它会将“a”放入root的键中,并发现没有任何定义的条件匹配,那么函数就会存在而不会执行任何操作。因此,返回值仅包含“a”。试试这个:

if (l[1] and l[2]) == None: return bt.getRootValue() elif l[1] != None and l[2] == None: bt.left = ll2nr(l[1]) elif l[2] != None and l[1] == None: bt.right = ll2nr(l[2]) else: bt.left = ll2nr(l[1]) bt.right = ll2nr(l[2])

答案 1 :(得分:0)

检查您的功能:

(...)
elif l[1] != None and l[2] == None:
    bt.left = ll2nr(l[1])
elif l[2] != None and l[1] == None:
    bt.right = ll2nr(l[2])

您可以轻松地看到添加print (l[1], l[2])代替点,这些条件都没有填满。

l[1] == ['b', ['d', None, None], ['f', None, None]]
and
l[2] == ['c', None, ['h', None, None]]

所以,第一个条件是真假而且==> false和second条件也是true和false ==>假。因此函数返回bt。

如果您将其更改为

if l[1] != None: # You might simply write "if l[1]:" as well...
    bt.left = ll2nr(l[1])
if l[2]:         # ...like this
    bt.right = ll2nr(l[2])

它可能会更好。

我改变了你的功能:

def make_tree(l):
    bt = BinaryTree(l[0])
    #if (l[1] and l[2]) == None:
    #    return bt.getRootValue()
    if l[1]:
        bt.left = make_tree(l[1])
    if l[2]:
        bt.right = make_tree(l[2])
    if not l[1] and not l[2]:
        bt.left = "*"
        bt.right = "*"
    return bt

def printer(node, depth=0):
    indent = '\t' * depth
    if node:
        if isinstance(node, basestring):
            print ("{}{}={}".format(indent, node, depth))
        else:
            print ("{}{}={}".format(indent, node.key, depth))
            printer(node.left, depth + 1)
            printer(node.right, depth + 1)
    else:
        print ("{}*={}".format(indent, depth))

并得到了很好的打印输出:

a=0
    b=1
        d=2
            *=3
            *=3
        f=2
            *=3
            *=3
    c=1
        *=2
        h=2
            *=3
            *=3