Tôi đã cố gắng triển khai lớp BinaryTree trong Ruby, nhưng tôi nhận được lỗi stack level too deep
, mặc dù tôi dường như không sử dụng bất kỳ đệ quy nào trong đoạn mã cụ thể đó:Thực hiện cây nhị phân trong Ruby
1. class BinaryTree
2. include Enumerable
3.
4. attr_accessor :value
5.
6. def initialize(value = nil)
7. @value = value
8. @left = BinaryTree.new # stack level too deep here
9. @right = BinaryTree.new # and here
10. end
11.
12. def empty?
13. (self.value == nil) ? true : false
14. end
15.
16. def <<(value)
17. return self.value = value if self.empty?
18.
19. test = self.value <=> value
20. case test
21. when -1, 0
22. self.right << value
23. when 1
24. self.left << value
25. end
26. end # <<
27.
28. end
Chỉnh sửa: Câu hỏi của tôi đã biến mất một chút. Thiết lập mã hiện tại mang lại cho tôi những lỗi stack level too deep
tại dòng 8. Tuy nhiên, nếu tôi sử dụng giải pháp Ed S. của
@left = @right = nil
sau đó phương pháp <<
phàn nàn nói: undefined method '<<' for nil:NilClass (NoMethodError)
tại dòng 22.
thể bất cứ ai đề nghị làm thế nào để giải quyết điều này? Ý tưởng của tôi là nếu tôi bằng cách nào đó có thể nói với lớp BinaryTree
rằng các biến số left
và right
là các trường hợp của BinaryTree
(tức là loại của chúng là BinaryTree
) thì tất cả sẽ tốt. Liệu tôi có sai?
Mỗi lần bạn gọi BinaryTree.new, nó chạm vào 'phương pháp initialize' và gọi một BinaryTree.new, và lặp đi lặp lại mãi mãi. Đó là lý do tại sao ngăn xếp của bạn tràn ngập – Edmund