Возврат Узла 1-Го Уровня В Сбалансированном Двоичном Дереве Поиска Ruby?

#ruby #data-structures #binary-search-tree

Вопрос:

Я рекурсивно создаю сбалансированное двоичное дерево поиска в Ruby с использованием отсортированного массива. Однако у меня возникли проблемы с конечным возвращаемым значением. Вместо того, чтобы все узлы всплывали, создавали дерево и возвращали узел базового уровня 1, возвращался самый последний узел в нижней части дерева.

Похоже, что создаваемые узлы вообще не связаны друг с другом (печать экземпляра класса с использованием p list возвращает только последний узел). Как связать узлы вместе и вернуть корневой узел 1-го уровня?

Код:

 class Node
  include Comparable

  attr_accessor :value, :left, :right

  def initialize(value, left = nil, right = nil)
    @value = value
    @left = left
    @right = right
  end
end

class Tree
  attr_accessor :sorted_arr, :arr

  def initialize(arr)
    @arr = arr
    @sorted_arr = arr.sort.uniq
  end

  #Problem: nodes not being linked together

  def build_tree(arr, start, last)
    if start > last
      return nil
    end

    mid_index = (start   last) / 2
    
    @root = Node.new(arr[mid_index])


    @root.left = build_tree(arr, start, mid_index - 1)
    @root.right = build_tree(arr, mid_index   1, last)


    return @root
  end
end

list = Tree.new([1, 7, 4, 23, 8, 9, 4, 3, 6, 7, 9, 67, 6345, 324])
list.build_tree(list.sorted_arr, 0, list.sorted_arr.length-1)
p list


 

Ответ №1:

Вы должны использовать root вместо @root .
Те, которые начинаются с @ , являются переменными экземпляра, поэтому, когда вы вызываете:

 @root.left = build_tree(arr, start, mid_index - 1)
 

внутри этого build_tree вызова в конечном итоге вы также вызовете, для @root = Node.new(arr[mid_index]) которого он заменит значение, уже установленное в родительском вызове.