问题描述
我正在使用排序数组在 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])
,它将替换已在父调用中设置的值。