2016-01-27 64 views
0

當試圖做廣度優先解決方案時,我遇到了意想不到的行爲。 在函數levelOrder中,如果左節點首先被處理,那麼它會給出正確的結果3 2 5 1 4 7,如果在左節點之前保留右節點,則輸出爲3 5 2 7 4 1.Python列出意外的行爲?

I不知道是什麼導致了這種行爲。 這個問題已經被問過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

哪一部分不明白?這是BFS的預期行爲。 –

+0

嗨Ignacio,在* list *作爲根,左和右追加的部分,但是當從列表中打印時,它會打印根,左和右。 – someone

回答

0

你給youself的解釋。如果你從右到左,你會得到相反的每一個級別。 2 5 - > 5 2和1 4 7 - > 7 4 1.

對於解決方案,您還應該考慮隊列。使用先入先出的方法,您可以在每個級別追加左右分支(如果不是無),然後將列表的第一個元素打印出下一級。當隊列爲空時,就完成了。

作爲一個附加點,您應該避免except Exception並更具體地說明例外情況,在此例中爲IndexError。這是一般編碼風格,以防止您不想處理的異常處理(如KeyboardInterrupt)。

+0

感謝Abufari,我會記住關於例外情況。 如果你注意到代碼,下一個元素被追加到列表的末尾,並在讀取時,它從索引0讀取,這使得它的FIFO 我需要了解的行爲,爲什麼右到左的元素是逆轉。 我的理解是,我在列表中添加_root,left,然後right_,但是從列表中打印時,它會打印_root,然後left_, 問題是導致此行爲的原因。 – someone