Python列出意外行为?

时间:2016-01-27 12:16:54

标签: python-3.x breadth-first-search

当尝试做广度优先解决方案时,我遇到了意想不到的行为。 在函数levelOrder中,如果首先处理左节点,则它给出正确的结果3 2 5 1 4 7,如果在左节点之前保留右节点,则输出为3 5 2 7 4 1.

我不知道造成这种行为的原因。 这个问题已在hackerrank

上提出

给定输入

     3
   /   \
  2     5
 / \     \
1   4     7

我的代码

import sys
class Node:
    def __init__(self,data):
        self.right=self.left=None
        self.data = data
class Solution:
    def insert(self,root,data):
        if root==None:
            return Node(data)
        else:
            if data<=root.data:
                cur=self.insert(root.left,data)
                root.left=cur
            else:
                cur=self.insert(root.right,data)
                root.right=cur
        return root

    def levelOrder(self,root):
        #Write your code here
        lisT = []
        i = 0
        lisT.append(root)

        while i < len(lisT):
            if root.left:
                lisT.append(root.left)
            if root.right:
                lisT.append(root.right)

            i += 1
            #print('i=',i,' len(lisT)=',len(lisT))
            try:
                root = lisT[i]
            except Exception as e:
                i = len(lisT)
        for each in lisT:
            print(each.data, end=' ')

            T=int(input())
myTree=Solution()
root=None
for i in range(T):
    data=int(input())
    root=myTree.insert(root,data)
myTree.levelOrder(root)            

1 个答案:

答案 0 :(得分:0)

你已经给出了解释。如果你从右到左,你会得到相反的每个级别。 2 5 - &gt; 5 2和1 4 7 - &gt; 7 4 1。

对于解决方案,您还应该考虑一个队列。使用先进先出,您可以在每个级别中附加左右分支(如果不是None),然后使用列表的第一个元素打印出下一个级别。当队列为空时,你就完成了。

作为补充,您应该避免except Exception并更加具体地了解异常,在本例中为IndexError。这是防止你不想处理的异常处理的一般编码风格(如KeyboardInterrupt)。

相关问题