Ruby on rails 基于Rspec的Ruby递归深度搜索

Ruby on rails 基于Rspec的Ruby递归深度搜索,ruby-on-rails,ruby,recursion,rspec,Ruby On Rails,Ruby,Recursion,Rspec,我目前在理解和实施DFS方面遇到了一个问题,这是我目前面临的挑战#find方法假定取根和数据(分类为节点),如果存在匹配项,则返回标题。这是我目前拥有的,我能找到的唯一帮助是: Rspec我正试图通过 describe "#find(data)" do it "handles nil gracefully" do tree.insert(root, empire) tree.insert(root, mad_max_2) expect(tree.fin

我目前在理解和实施DFS方面遇到了一个问题,这是我目前面临的挑战
#find
方法假定取
数据
(分类为节点),如果存在匹配项,则返回
标题
。这是我目前拥有的,我能找到的唯一帮助是:

Rspec我正试图通过

describe "#find(data)" do
    it "handles nil gracefully" do
      tree.insert(root, empire)
      tree.insert(root, mad_max_2)
      expect(tree.find(root, nil)).to eq nil
    end

    it "properly finds a left node" do
      tree.insert(root, pacific_rim)
      expect(tree.find(root, pacific_rim.title).title).to eq "Pacific Rim"
    end

    it "properly finds a left-left node" do
      tree.insert(root, braveheart)
      tree.insert(root, pacific_rim)
      expect(tree.find(root, pacific_rim.title).title).to eq "Pacific Rim"
    end

    it "properly finds a left-right node" do
      tree.insert(root, donnie)
      tree.insert(root, inception)
      expect(tree.find(root, inception.title).title).to eq "Inception"
    end

    it "properly finds a right node" do
      tree.insert(root, district)
      expect(tree.find(root, district.title).title).to eq "District 9"
    end

    it "properly finds a right-left node" do
      tree.insert(root, hope)
      tree.insert(root, martian)
      expect(tree.find(root, martian.title).title).to eq "The Martian"
    end

    it "properly finds a right-right node" do
      tree.insert(root, empire)
      tree.insert(root, mad_max_2)
      expect(tree.find(root, mad_max_2.title).title).to eq "Mad Max 2: The Road Warrior"
    end
  end
我遇到的常见错误

BinarySearchTree#find(data) properly finds a left node
     Failure/Error: expect(tree.find(root, pacific_rim.title).title).to eq "Pacific Rim"

     NoMethodError:
       undefined method `title' for "Pacific Rim":String
     # ./binary_search_tree.rb:37:in `find'
     # ./binary_search_tree_spec.rb:66:in `block (3 levels) in <top (required)>'
BinarySearchTree#find(data)正确地查找左侧节点
失败/错误:expect(tree.find(root,pacific_-rim.title).title)到eq“pacific-rim”
命名错误:
“环太平洋”的未定义方法“title”:字符串
#./binary\u search\u tree.rb:37:in'find'
#./binary\u search\u tree\u spec.rb:66:in'block(3级)in'
我希望返回
数据
(节点),但不确定如何解释测试并获得正确的输出。感谢您的帮助和/或建议。谢谢。

以下是您的查找方法:

def find(root, data)
  if data == nil
    return nil
  elsif root.title == data
    return data
  else
    left = find(root.left, data) if root.left
    right = find(root.right, data) if root.right
    left or right
  end
end

您返回的是
数据
,它将是一个字符串,或者至少是在比较
根目录时指示的字符串。title==数据
。您想返回节点本身。

ding,呃……谢谢。这很管用,我看得太多了。递归很简单。谢谢
def find(root, data)
  if data == nil
    return nil
  elsif root.title == data
    return data
  else
    left = find(root.left, data) if root.left
    right = find(root.right, data) if root.right
    left or right
  end
end