在平衡二叉搜索树 Ruby 中返回 Level-1 节点?

问题描述

我正在使用排序数组在 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,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,3,6,67,6345,324])
list.build_tree(list.sorted_arr,list.sorted_arr.length-1)
p list


解决方法

您应该使用 root 而不是 @root
@ 开头的那些是实例变量,所以当你调用:

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

在该 build_tree 调用中,最终您还将调用 @root = Node.new(arr[mid_index]),它将替换已在父调用中设置的值。