树遍历python

时间:2016-02-11 21:05:48

标签: python-3.x binary-tree inorder preorder postorder

我必须定义三个函数:postorder(t):inorder(t):flat_list()

每个函数都将二叉树作为输入并返回一个列表。然后应该以相同的方式对列表进行排序,在相应的遍历(后序,预订或有序)中访问树元素

我已经为每个人编写了一个代码,但是当我调用另一个函数(if not x or len(x) < 1 or n > len(x) or x[n] == None: IndexError: list index out of range )时,我一直收到错误,我得到了一个索引错误

def postorder(t):
    pass
    if t != None:
        postorder(t.get_left())
        postorder(t.get_right())
    print(t.get_data())

def pre_order(t):
    if t != None:
        print(t.get_data())
        pre_order(t.get_left())
        pre_order(t.get_right())

def in_order(t):
    pass
    if t != None:
        in_order(t.get_left())
        print(t.get_data())
        in_order(t.get_right())

def flat_list2(x,n):
  if not x or len(x) < 1 or  n > len(x) or x[n] == None:
    return None

   bt = BinaryTree( x[n] )
   bt.set_left( flat_list2(x, 2*n))
   bt.set_right(flat_list2(x, 2*n + 1))
 return bt

我的遍历方法的代码如下:

flat_node_list = [None, 55, 24, 72, 8, 51, None, 78, None, None, 25]
bst = create_tree_from_flat_list2(flat_node_list,1)

    pre_order_nodes = pre_order(bst)

    in_order_nodes = in_order(bst)

    post_order_nodes = post_order(bst)

    print( pre_order_nodes)

    print( in_order_nodes)

    print( post_order_nodes)

这就是我如何调用flat_list2

sudo watch tail /var/log/apache2/error.log

2 个答案:

答案 0 :(得分:1)

实际上你应该编写三个返回迭代器的函数。让呼叫者决定是否需要列表。使用发电机功能最容易做到这一点。在3.4+中,'yield from`可以用来代替for循环。

def in_order(t):
    if t != None:
        yield from in_order(t.get_left())
        yield t.get_data()
        yield from in_order(t.get_right())

移动其他两个版本的yield语句。

答案 1 :(得分:0)

首先,我注意到您的缩进在您提供的代码块中不一致(在修订版中已修复)。 严重确保您的缩进在Python中保持一致,否则将很快向南移动。此外,在下面的代码中,我假设您希望t.get_data()仍然属于if t != None中的postorder(t),所以我在下面缩进。最后,我注意到您的方法名称与您在问题中列出的规范不匹配,因此我更新了以下方法名称以符合您的规范(命名中没有_)。

要获取列表,您需要做的就是让遍历方法返回一个列表,然后在遍历的每个级别使用其他遍历值extend列表。这样做不是打印数据。

def postorder(t):
    lst = []
    if t != None:
        lst.extend(postorder(t.get_left()))
        lst.extend(postorder(t.get_right()))
        lst.append(t.get_data())
    return lst

def preorder(t):
    lst = []
    if t != None:
        lst.append(t.get_data())
        lst.extend(preorder(t.get_left()))
        lst.extend(preorder(t.get_right()))
    return lst

def inorder(t):
    lst = []
    if t != None:
        lst.extend(inorder(t.get_left()))
        lst.append(t.get_data())
        lst.extend(inorder(t.get_right()))
    return lst

这将遍历每个节点上的左右两侧的完整深度,并且取决于它是preorderpostorder还是inorder,将附加所有遍历的元素。命令它们被遍历。一旦发生这种情况,它会将正确排序的列表返回到下一级别,以便附加到其列表中。这将递归,直到你回到根级别。

现在,来自IndexError的{​​{1}}可能是由于flat_list可能等于x[n]时尝试访问n而导致的。请记住,len(x)中的列表/数组是从Python编制索引的,这意味着列表的最后一个元素是0,而不是x[n-1]

因此,要解决此问题,请将x[n]替换为x[n]。像这样:

x[n-1]