递归插入二进制搜索树不会添加正确的节点

时间:2018-09-10 03:28:25

标签: ruby-on-rails binary-tree binary-search-tree

我有以下用于创建二进制搜索树的类

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,则很难正确地排列树。排列树的唯一条件是,每个节点的左侧必须先在右侧之前完成,然后才能移至下一个深度并正确对齐。

如何使它正确对齐?这就是我期望我的树被安排的方式 enter image description here

0 个答案:

没有答案