RubyTree — библиотека для создания древовидных структур данных

ноября 1, 2010  |  Published in Ruby Gems  |  2 Comments

ruby treeRubyTree — это библиотека позволяющая создавать и управлять древовидными структурами данных основанными на узлах, где каждый узел является одновременно и значением, и ключем, для доступа к вложенным узлам. Одной из важных особенностей / функций RubyTree является возможность  импорта и экспорта в json формат.

Библиотека RubyTree будет интересна для тех, кто разрабатывает какие-либо научные приложения — каталоги, где необходима таксономия, либо приложения, что сейчас набирают популярность, для создания гениалогического дерева и т.д. Кстати, древовидная структура данных используется и во всеми нами любимой Википедии.

Устройство RubyTree.

RubyTree предоставляет модуль Tree, который содержит в себе два класса: TreeNode и BinaryTreeNode, который наследуется от TreeNode и представляет собой ту же структуру, но с ограничением на количество дочерних узлов: их должно быть только 2: левий и правый дочерние узлы.

Установка:

$ gem install rubytree
Примеры использования из официального руководства:

# Начинаем работу с RubyTree.
require 'tree'                 # загружаем библиотеку

# Сперва создаем корневой узел. Обратите внимание, что каждый узел обязательно должен иметь имя и (не обязательно) некоторое содержимое.
root_node = Tree::TreeNode.new("ROOT", "Содержимое ROOT")

# Теперь добавим дочерние узлы. Запомните, что вы можете создавать "цепочки" вложенности любой длины (глубины вложенности).

root_node << Tree::TreeNode.new("CHILD1", "Child1 Content") << Tree::TreeNode.new("GRANDCHILD1", "GrandChild1 Content")

root_node << Tree::TreeNode.new("CHILD2", "Child2 Content")

# Давайте выведем представление нашего дерева на стандартном устройстве вывода (stdout). Это используется прежде всего в целях дебагинга.
root_node.print_tree

# Теперь давайте непосредственно обратимся к дочерним узлам ROOT и дочерним узлам дочерних узлов ROOT. Здесь мы также можем использовать цепочки любой  длины (обращаться к любому уровню иерархии)
child1 = root_node["CHILD1"]
grand_child1 = root_node["CHILD1"]["GRANDCHILD1"]

# Получаем массив всех родных братьев текущего узла.
siblings_of_child1 = child1.siblings

# Получаем массив всех детей (вложенных узлов первого уровня вложенности) для корня дерева ROOT.
children_of_root = root_node.children

# Напечатаем  "перевернутое" содержимое всех узлов.
root_node.each { |node| puts node.content.reverse }

# удаляем дочерний узел из корня дерева ROOT
root_node.remove!(child1)

RDoc документация по RubyTree

Tags:

Responses

  1. Fate says:

    марта 24, 2012 at 14:01 (#)

    А есть ли реализация B-деревьев?

  2. admin says:

    марта 27, 2012 at 16:59 (#)

    Конкретно в этом геме? Давно не смотрел, но когда им пользовался — не было, да и сейчас их вряд ли добавили. В-деревья как, я понимаю, имеет смысл использовать для хранения данных в БД, а для Ruby зачем они?

Leave a Response

Для подсветки кода используйте BB - коды: [language]...[/language], где language может быть: ruby, javascript, css, html.