Ruby递归DFS方法

时间:2015-07-02 18:56:35

标签: ruby-on-rails ruby recursion depth-first-search

我在深度优先搜索算法实现的递归方法上遇到了一些麻烦。这是二叉树照片:

enter image description here

该方法适用于树的右侧(55,89,144),但是当它到达左侧时它返回nil,即使它放置“是”。那么,代码有什么问题?该节点是Node类的一个实例,它具有值(整数)和指向左右子节点(Node类的其他实例)的链接,如果它没有来自该端的子节点,则为nil。

以下是方法代码:

def depth_first_search(node, target)
    if node.value == target
        puts "yes"
        return node
    end
    depth_first_search(node.child_left, target) if node.child_left
    depth_first_search(node.child_right, target) if node.child_right
end

1 个答案:

答案 0 :(得分:5)

由于depth_first_search(node.child_left, target)不是方法的最后一行,因此永远不会返回其值。如果值不是nil,则需要返回其值。以下是解决问题的一种方法示例:

def depth_first_search(node, target)
    if node.value == target
        puts "yes"
        return node
    end
    left = depth_first_search(node.child_left, target) if node.child_left
    right = depth_first_search(node.child_right, target) if node.child_right
    left or right
end

请注意,即使在左子树上找到了正确的节点,此示例也将搜索正确的子树,这是低效的。