我正在尝试创建一个函数,该函数接收列表列表并从列表列表中的元素返回二叉树。列表列表遵循以下格式:[" root "," 左子树"," 右子树"]
如何使用递归来解析列表列表并创建二叉树。 主要问题是列表列表不一定遵循相同的模式。
所以,例如:
lst = ['root', ['left_child', 'leaf' , 'leaf'], ['right_child', 'leaf', 'leaf']]
但它也可以是:
lst = ['root', [], ['right_child', ['leaf', 'value', 'value'] , 'leaf']]
有许多不同的条件可以根据不同类型的列表而有所不同,因此主要问题归结为如何使用递归来查看不遵循除[" root "," 左子树"," 右子树"]。什么样的条件语句可以帮助我避免索引错误。
注意: BinaryTree类已经内置了setLeft和setRight,并在初始化时请求root
感谢您的见解。
答案 0 :(得分:1)
这个 是一个可预测的模式;只是树也可以是空列表或字符串(即叶子)。这就是你的模式:任何时候你可以拥有一棵树,它可以采取以下三种形式之一:
None
,但我无法肯定地说答案 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]
"""