美文网首页程序员
用Ruby实现算法--二叉查找树

用Ruby实现算法--二叉查找树

作者: spike15 | 来源:发表于2016-08-16 19:26 被阅读0次

二叉查找树的性质

  • 若任意节点的左子树不为空,则左子树上所有结点的值均小于它的根结点的值;
  • 任意节点的右子树不为空,则右子树上所有结点的值均大于它的根结点的值;
  • 任意节点的左、右子树也分别为二叉查找树。
  • 没有键值相等的节点(no duplicate nodes)。

节点

根据二叉查找树性质不难写出节点类

class Node

  attr_reader :value
  attr_accessor :left, :right

  def initialize(v)
    @value = v
  end

end

插入节点

根据二叉查找树的性质:

  1. 若值等于根节点, 不插入
  2. 若根节点为空, 插入根节点
  3. 若值小于根节点, 插入左子树
  4. 若值大于根节点
def insert(v)
  case value <=> v
  when 1 then insert_left(v)
  when -1 then insert_right(v)
  when 0 then false 
  end
end

def inspect
  "{#{value}::#{left.inspect}|#{right.inspect}}"
end

private

  def insert_left(v)
    if left
      left.insert(v)
    else
      self.left = Node.new(v)
    end
  end

  def insert_right(v)
    if right
      right.insert(v)
    else
      self.right = Node.new(v)
    end
  end

空节点

在上面的Node对象中, leftright为nil, 这样在插入时就需要判断左右是否为nil, 在之后的查找中也需要做nil判断, 十分的繁琐
加入空节点的概念就可以去除冗余的nil判断, 简化代码


class EmptyNode
  # 预留给查询用
  def include?(*)
    false
  end

  def insert(*)
    false
  end

  def inspect
    "{}"
  end
  
end

重新定义一下Node的代码

class Node

  attr_reader :value
  attr_accessor :left, :right

  def initialize(v)
    @value = v
    @left = EmptyNode.new
    @right = EmptyNode.new
  end

  def inspect
    "{#{value}::#{left.inspect}|#{right.inspect}}"
  end

  def insert(v)
    case value <=> v
      when 1 then insert_left(v)
      when -1 then insert_right(v)
      when 0 then false
    end
  end

  private
    # 插入时不再需要nil判断, 空节点的insert返回false
    def insert_left(v)
      left.insert(v) or @left = Node.new(v)
    end

    def insert_right(v)
      right.insert(v) or @right = Node.new(v)
    end

end

查找

因为二叉树的左右是有序的, 使用递归就可以简单实现, 步骤如下

  1. 若树是空的, 则查找未命中
  2. 若等于根节点, 则查找命中
  3. 若小于根节点, 则查找左子树
  4. 若大于根节点, 则查找右子树
  def include?(v)
    case value <=> v
      when 1 then left.include?(v)
      when -1 then right.include?(v)
      when 0 then true
    end
  end

现在找不到值时, 自然会返回false
若是没有EmptyNode的定义, 这里会有很繁琐的nil判断

相关文章

  • 用Ruby实现算法--二叉查找树

    二叉查找树的性质 若任意节点的左子树不为空,则左子树上所有结点的值均小于它的根结点的值; 任意节点的右子树不为空,...

  • 二叉树 堆 2019-04-17

    二叉树 实现一个二叉查找树,并且支持插入、删除、查找操作 实现查找二叉查找树中某个节点的后继、前驱节点 实现二叉树...

  • 树表查找算法

    最简单的树表查找算法——二叉树查找算法 基本思想 二叉查找树是先对待查找的数据进行生成树,确保树的左分支的值小于右...

  • 7天练|Day5:二叉树和堆

    关于二叉树和堆的7个必知必会的代码实现二叉树实现一个二叉查找树,并且支持插入、删除、查找操作实现查找二叉查找树中某...

  • 二叉树--二叉查找树定义

    今天时间有限,就没有单独实现二叉树算法,简单实现了一个二叉查找树的类。 题目介绍 实现一个二叉树,实现以下两个功能...

  • 二叉查找树

    1)二叉查找树是什么?2)二叉查找树的插入、删除、查找?3)Go代码实现 一、二叉查找树是什么?二叉查找树(BST...

  • 二叉搜索树

    二叉搜索树 图解二叉树搜索算法图解:二叉搜索树算法二叉查找树(Binary Search Tree),(又:二叉搜...

  • iOS开发集锦之 2017.03.30(Swift 算法实战之路

    1. Swift 算法实战之路:二叉树 作者: 故胤道长描述:基本概念:实现,深度 ,二叉查找树; 遍历; 苹果面...

  • 二叉查找树的查找和排序方法的实现

    定义二叉树 二叉查找树的查找和排序方法的实现

  • 数据结构——树

    有关树的算法题总结 实现二叉树的前序、中序、后序遍历(递归、非递归,mirros方法) 查找后继节点 二叉树的序列...

网友评论

    本文标题:用Ruby实现算法--二叉查找树

    本文链接:https://www.haomeiwen.com/subject/wbwpsttx.html