如何在不遵循可预测模式的列表列表上使用递归

时间:2015-02-27 19:42:45

标签: python list recursion binary-tree

我正在尝试创建一个函数,该函数接收列表列表并从列表列表中的元素返回二叉树。列表列表遵循以下格式:[" root "," 左子树"," 右子树"]

如何使用递归来解析列表列表并创建二叉树。 主要问题是列表列表不一定遵循相同的模式。

所以,例如:

lst = ['root', ['left_child', 'leaf' , 'leaf'], ['right_child', 'leaf', 'leaf']]

但它也可以是:

lst =  ['root', [], ['right_child', ['leaf', 'value', 'value'] , 'leaf']]

有许多不同的条件可以根据不同类型的列表而有所不同,因此主要问题归结为如何使用递归来查看不遵循除[" root "," 左子树"," 右子树"]。什么样的条件语句可以帮助我避免索引错误。

注意: BinaryTree类已经内置了setLeft和setRight,并在初始化时请求root

感谢您的见解。

2 个答案:

答案 0 :(得分:1)

这个 是一个可预测的模式;只是树也可以是空列表或字符串(即叶子)。这就是你的模式:任何时候你可以拥有一棵树,它可以采取以下三种形式之一:

  1. 一个空列表,可能对应于BinaryTree中的None,但我无法肯定地说
  2. 一个字符串,一片叶子,我也不知道你的BinaryTree如何处理
  3. 一个完整的二叉树节点,您似乎已经了解它。

答案 1 :(得分:1)

我的实施我几分钟后就开始了。从列表构建二叉树,然后执行有序遍历以验证树是否已正确构建。我使用isinstance来验证节点是否是一个叶子(即:一个字符串)或不是(即:一个列表),但这有点像黑客。

class Tree:

    def __init__(self, val=None):
        self.root = val
        self.left = None
        self.right = None

    def in_order_print(self):
        if self.root is None:
            return
        if isinstance(self.left, Tree):
            self.left.in_order_print()
        print self.root
        if isinstance(self.right, Tree):
            self.right.in_order_print()


def grab(alist):
    return alist[0], alist[1], alist[2]


def recurse_it(atree, alist):
    if alist == [] or isinstance(alist, basestring):
        return
    root, left, right = grab(alist)
    atree.root = root
    atree.left = Tree(left)
    atree.right = Tree(right)
    recurse_it(atree.left, left)
    recurse_it(atree.right, right)

    return atree


def list_to_tree(alist):
    return recurse_it(Tree(), alist)


def main():
    lst1 = ['root', ['left_child', 'leaf', 'leaf'],
            ['right_child', 'leaf', 'leaf']]

    lst2 = ['root', [], ['right_child', ['leaf', 'value', 'value'], 'leaf']]

    thetree1 = list_to_tree(lst1)
    thetree1.in_order_print()

    print '___________________________'

    thetree2 = list_to_tree(lst2)
    thetree2.in_order_print()


if __name__ == '__main__':
    main()


"""
Tree1:
                       [ root ]
                  [left]      [right]
               [leaf][leaf] [leaf][leaf]


Tree2: 
                       [ root ]
                  []          [right]
                         [leaf]     [leaf]
                   [value][value]  
"""