【问题标题】:CTCI 4.3: Given a binary tree, design an algorithm which creates a linked list of all the nodes at each depthCTCI 4.3:给定一棵二叉树,设计一个算法,在每个深度创建一个所有节点的链表
【发布时间】:2016-12-31 20:09:41
【问题描述】:

我正在用 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

【问题讨论】:

    标签: ruby algorithm data-structures linked-list graph-algorithm


    【解决方案1】:

    一个问题:dfs 每次调用时都会创建一个新的level_hash[new_level]。但是它会为每个节点调用一次,因此每次找到新节​​点时都会覆盖列表。不确定是否还有其他问题,但那个跳出来了。

    您的思维过程似乎还可以。对于这样的问题,我会考虑使用 BFS 而不是 DFS,因为您正在尝试按深度对事物进行分组。不过,基于 DFS 的方法确实有效。

    要检查您的代码,您可以先对其进行推理,然后对它进行橡皮擦,这样会发现很多错误。否则,根本无法替代使用实际输入来测试您的代码。在采访中,我被要求做相当多的事情。测试时,您要确保对代码进行良好的覆盖;尝试走下所有不同的代码路径。并尝试找到特殊情况进行测试(在这种情况下,如果你传入一棵空树怎么办?或者它的根没有孩子?)

    【讨论】:

      猜你喜欢
      • 2015-05-01
      • 1970-01-01
      • 2018-12-17
      • 2021-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多