#tree #id_tree #id-tree

id_tree

A library for creating and modifying Tree structures

21 releases (10 stable)

1.4.0 Feb 9, 2019
1.3.0 May 22, 2018
1.2.0 Nov 23, 2017
1.1.3 Jul 9, 2017
0.2.4 Oct 17, 2016

#70 in Data structures

Download history 122/week @ 2018-10-27 150/week @ 2018-11-03 144/week @ 2018-11-10 74/week @ 2018-11-17 223/week @ 2018-11-24 111/week @ 2018-12-01 69/week @ 2018-12-08 112/week @ 2018-12-15 246/week @ 2018-12-22 52/week @ 2018-12-29 93/week @ 2019-01-05 86/week @ 2019-01-12 51/week @ 2019-01-19 59/week @ 2019-01-26 116/week @ 2019-02-02

475 downloads per month
Used in 5 crates (4 directly)

MIT license

153KB
2.5K SLoC

id_tree

Build Status Build status Coverage Status Docs.rs Crates.io

A library for creating and modifying Tree structures.

Overview

In this implementation, the Tree owns all of the Nodes and all inter-Node relationships are managed with NodeIds.

Trees in this library are "just" trees. They do not allow cycles. They do not allow the creation of arbitrary Graph structures. There is no weight associated with edges between Nodes. In addition, each Node can have an arbitrary number of child Nodes.

It is important to note that this library does not support comparison-based Node insertion. In other words, this is not a Binary Search Tree (or any other kind of search tree) library. It is purely a library for storing data in a hierarchical manner. The caller must know the structure that they wish to build and then use this library to do so; this library will not make those structural decisions for you.

Example Usage

use id_tree::*;

fn main() {
    use id_tree::InsertBehavior::*;

    //      0
    //     / \
    //    1   2
    //   / \
    //  3   4
    let mut tree: Tree<i32> = TreeBuilder::new()
        .with_node_capacity(5)
        .build();

    let root_id: NodeId = tree.insert(Node::new(0), AsRoot).unwrap();
    let child_id: NodeId = tree.insert(Node::new(1), UnderNode(&root_id)).unwrap();
    tree.insert(Node::new(2), UnderNode(&root_id)).unwrap();
    tree.insert(Node::new(3), UnderNode(&child_id)).unwrap();
    tree.insert(Node::new(4), UnderNode(&child_id)).unwrap();

    println!("Pre-order:");
    for node in tree.traverse_pre_order(&root_id).unwrap() {
        print!("{}, ", node.data());
    }
    // results in the output "0, 1, 3, 4, 2, "
}

Project Goals

  • Allow caller control of as many allocations as possible (through pre-allocation)
  • Fast Node insertion and removal
  • Arbitrary Tree structure creation and manipulation

Non-Goals

  • Arbitrary Graph structure creation and manipulation
  • Comparison-based node insertion of any kind

Contributors

Dependencies