Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby CTCI 4.3:给定一个二叉树,设计一个算法,在每个深度创建所有节点的链表_Ruby_Algorithm_Data Structures_Linked List_Graph Algorithm - Fatal编程技术网

Ruby CTCI 4.3:给定一个二叉树,设计一个算法,在每个深度创建所有节点的链表

Ruby CTCI 4.3:给定一个二叉树,设计一个算法,在每个深度创建所有节点的链表,ruby,algorithm,data-structures,linked-list,graph-algorithm,Ruby,Algorithm,Data Structures,Linked List,Graph Algorithm,我正在用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

我正在用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\u散列[new\u level]
。但它会为每个节点调用一次,因此每次找到新节点时,都会覆盖列表。不确定是否还有其他问题,但这个问题突然出现了

你的思维过程似乎还可以。我会考虑做一个BFS而不是一个DFS来解决这样的问题,因为你试图按深度分组。不过,基于DFS的方法肯定有效

要检查您的代码,您可以先对代码进行推理,然后将其隐藏起来,这样会捕获很多错误。否则,用实际输入测试代码是无法替代的。我在采访中被要求做很多这样的事情。在测试时,您希望确保获得代码的良好覆盖率;试着沿着所有不同的代码路径走下去。并尝试找到要测试的特殊情况(在这种情况下,如果您传入一个空树,或者传入一个根没有子树的树,该怎么办?)