我有以下用于创建二进制搜索树的类
avl_tree.rb
class AVLTree
def initialize val
@root = AVLTreeNode.new(val,nil,nil)
@inserted_values = []
@parent_node= nil
@current_node = nil
end
def insert(value)
@current_node = @root if @current_node.nil?
while nil != @current_node
if (@current_node.left == nil) && (value != @current_node.right.try(:value)) && !@inserted_values.include?(value)
@current_node.left = AVLTreeNode.new(value,nil,nil)
@inserted_values << value
elsif (@current_node.right == nil) && (value != @current_node.left.try(:value)) && !@inserted_values.include?(value)
@current_node.right = AVLTreeNode.new(value,nil,nil)
@inserted_values << value
elsif (@current_node.left.try(:value) != nil && @current_node.right.try(:value) != nil)
if @parent_node.nil?
@parent_node = @current_node
@current_node = @current_node.left
elsif @parent_node.present?
if @parent_node.left.left.present? && @parent_node.left.right.present?
if @current_node.left.present? && @current_node.right.present?
@current_node = @parent_node.right
end
end
end
else
return
end
end
end
end
avl_tree_node.rb
class AVLTreeNode
attr_accessor :value, :left, :right
def initialize val,left,right
@value = val
@left = left
@right = right
end
end
在这段代码中,我试图做的是创建一个只向节点分配值的二叉搜索树。为此,这是我的代码,以5为根。
bst = AVLTree.new(5)
descendants = [6, 4, 3, 2, 1, 7, 8]
descendants.each do |dd| bst.insert(dd) end
此代码的问题在于,如果descendants = [6, 4, 3, 2, 1]
正确插入了树,但是如果数组中的长度大于5,则很难正确地排列树。排列树的唯一条件是,每个节点的左侧必须先在右侧之前完成,然后才能移至下一个深度并正确对齐。