lineartree

Crates.io Page Build Status Coverage Status Docs.rs Page MIT License Number of Lines of Code

A simple and easy-to-use tree data structure for rust.

This crate implements trees using a single vector to hold all nodes, hence the name. Basically it's a Vec<Node<T>>, where each Node<T> has indices of parents and children.

On top of that, there's some convenience functions to iterate depth-first and breadth-first across nodes, find children, and so on.

Quick Start

Tree creation

```rust use lineartree::{Tree, NodeRef};

/* This builds the following tree * "/" * / \ * etc usr * / \ * bin lib */

let mut tree = Tree::new();

// Trees usually have a root node let fs_root = tree.root("/")?;

// Using .root() or .node() return a NodeRef object // which can be later used to identify and manipulate // node values. let usr = tree.node("usr"); tree.appendchild(fsroot, usr)?;

// Add multiple children at once let bin = tree.node("bin"); let lib = tree.node("lib"); tree.append_children(usr, &[bin, lib])?;

// You can also add nodes to a parent in a single go let etc = tree.childnode(fsroot, "etc")?; ```

Getting, changing and removing nodes

```rust // Get node values (this is O(1)) asserteq!(tree.get(lib), Some(&"lib")); asserteq!(tree.get(lib), Some(&"lib")); asserteq!(tree.getmut(lib), Some(&mut "lib"));

// Remove node, this won't resize the underlying Vec // because otherwise node references will be invalidated. tree.remove(etc)?; ```

Getting number of nodes

rust // .len() is also O(1) assert_eq!(tree.len(), 4);

Traverse tree

```rust // Here are the basic hierarchical operators asserteq!(tree.getparent(usr)?, Some(fsroot)); asserteq!( tree.get_children(usr).unwrap().collect::>(), vec![bin, lib], );

// Iterate depth first over a node children. // Use .depthfirst() to iterate the entire tree. for node in tree.depthfirst_of(usr)? { // ... } ```

Documentation