2014-10-31 91 views
0

這是一個採訪問題: 給定二叉樹的節點'k',找到它的所有兄弟和表兄弟。沒有可用於節點的nextPointer查找給定節點級別的所有節點

考辛斯:在相同的水平給定節點「K」排除「K」

的兄弟我知道答案,可以找到的水平,在其中,k謊言(第1次),然後打印所有節點該級別的節點(第2遍)(使用級別遍歷)。但是,這將是一個2遍算法。任何人都可以爲它提出一個通過或更有效的算法。

實施例:

 15 
    /\ 
    18 19 
/\ /\ 
    2 3 4 5 
/\//\ 
1 6 7 8 9 

Input: k=6 
Output: 1,7,8,9 
+0

「更高效」是什麼意思?就時間複雜度而言,該算法是最優的,因爲它具有'O(n)'時間複雜度(在最壞的情況下輸出大小爲'O(n)')。 – kraskevich 2014-10-31 17:40:05

+0

您可以通過在當前級別形成所有條目的列表/集合,並查看其中是否包含「k」來進行單個級別遍歷:只篩選出它的兄弟(s)報告表兄弟可能需要保留一些額外的元數據,儘管...... – twalberg 2014-10-31 17:59:38

回答

0

的算法的概要是使用改性BFS:

  1. 設置一個隊列爲空
  2. 設置一個布爾 '發現' 爲假。
  3. 排隊根。
  4. 入隊一個空佔位符。
  5. 對於隊列中的每個元素,直到佔位符排入子元素。排隊時,如果數字與輸入值匹配,則將'found'設置爲true。
  6. 將空佔位符從前面移到隊列後面。
  7. 如果發現是錯誤,則繼續5.
  8. 如果找到是true,則打印排除該值的隊列。

這將在一次通過。

0

使用BFS以級別順序打印樹,然後使用給定節點檢查每個級別。時間複雜度是O(n)。

相關問題