Я реализую бинарное дерево поиска в ruby и пытаюсь определить функцию для удаления значения из дерева. Дерево имеет значение @root, которое указывает на объект Node. который определяется как:
class Node
attr_reader :value
attr_accessor :left, :right
def initialize value=nil
@value = value
@left = nil
@right = nil
end
# Add new value as child node to self, left or ride
# allows for duplicates, to L side of tree
def insert new_value
if new_value <= @value
@left.nil? ? @left = Node.new(new_value) : @left.insert(new_value)
elsif new_value > @value
@right.nil? ? @right = Node.new(new_value) : @right.insert(new_value)
end
end
end
Таким образом, все узлы содержат ссылки на своих дочерних элементов L & R. Все работает на дереве, вставка, обход, выполнение поиска в ширину (level-order-traverse) для возврата значения Node, если оно найдено.
Проблема, с которой я сталкиваюсь, заключается в попытке удалитьУзловой объект. Я не могу понять, как установить фактический ОБЪЕКТ равным nil или его дочернему элементу, например, вместо переназначения POINTER / переменной на nil, и объект все еще существует.
Дерево имеет две функции, которыедолжен сделать это (вы можете предположить, что breadth_first_search правильно возвращает соответствующий найденный узел, как и smalllest_r_child_of)
def remove value
node = breadth_first_search(value)
return false if node.nil?
remove_node(node)
end
def remove_node node
if node.left.nil? && node.right.nil?
node = nil
elsif !node.left.nil? && node.right.nil?
node = node.left
elsif node.left.nil? && !node.right.nil?
node = node.right
else
node = smallest_r_child_of(node)
end
return true
end
Я думал, что, передав объект фактического узла в remove_node
, я мог бы вызвать node = ____
и тому подобное, чтобы переназначить фактический объект на что-то другое, но, насколько я могу судить, все, что он делает, это сбрасывает переменную / указатель аргумента node
, фактически не переназначая мои данные.
У кого-нибудь есть какие-либо советы / предложения о том, как выполнить то, что я пытаюсь сделать?