簡體   English   中英

CTCI 4.3:給定二叉樹,設計一種算法,該算法創建每個深度的所有節點的鏈表

[英]CTCI 4.3: Given a binary tree, design an algorithm which creates a linked list of all the nodes at each depth

我正在使用Ruby解決此問題,並使用了一種經過修改的DFS算法來實現。 這個想法是,每次DFS必須查看相鄰節點時,它都在查看子節點,因此這是一個新級別,並記錄在下面的哈希中。

這個實施/思想過程正確嗎? 在此說明上,對於我自己的實現而不創建用於輸入的不同二叉樹的有效方法是什么?

#Given a binary tree, design an algorithm which creates a linked list of all the nodes at each depth.
#(e.g if you have a tree with depth D, you'll have D linked lists).

#Space: O(N)
#Time: O(N)
def linked_list_hash(head)
  level_hash = {}
  level_hash[1] = LinkedList.new(head)
  dfs(head, level_hash)
  level_hash
end

def dfs(node, level_hash)
  new_level = level_hash.keys.last+1
  level_hash[new_level] = LinkedList.new 
  adj(node).each do |child|
    level_hash[new_level].insert(child)
    dfs(child, level_hash)
  end
end

private 
def adj(node)
  [node.left, node.right]
end

一個問題: dfs每次調用時都會創建一個新的level_hash[new_level] 但是每個節點都會調用一次,因此,每次找到新節​​點時,您都​​將覆蓋列表。 不知道是否還有其他問題,但是那一個跳了出去。

您的思考過程似乎還可以。 對於這樣的問題,我將考慮使用BFS而不是DFS,因為您正在嘗試按深度對事物進行分組。 當然,基於DFS的方法確實有效。

要檢查您的代碼,您可以先進行推理,然后進行橡膠誘導,這會捕獲很多錯誤。 否則,就沒有替代品可以使用實際輸入來測試您的代碼。 我被要求在面試中做到這一點。 測試時,您要確保對代碼有良好的了解; 嘗試查找所有不同的代碼路徑。 並嘗試查找特殊情況進行測試(在這種情況下,如果您傳入一棵空樹或根沒有孩子的樹怎么辦?)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM