Crates.io | lineartree |
lib.rs | lineartree |
version | 0.1.1 |
source | src |
created_at | 2020-12-09 20:19:30.453327 |
updated_at | 2020-12-27 07:59:02.908188 |
description | A simple tree data structure for rust |
homepage | https://github.com/frapa/lineartree |
repository | https://github.com/frapa/lineartree |
max_upload_size | |
id | 321278 |
size | 24,878 |
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.
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.append_child(fs_root, 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.child_node(fs_root, "etc")?;
// Get node values (this is O(1))
assert_eq!(tree.get(lib), Some(&"lib"));
assert_eq!(tree.get(lib), Some(&"lib"));
assert_eq!(tree.get_mut(lib), Some(&mut "lib"));
// Remove node, this won't resize the underlying Vec
// because otherwise node references will be invalidated.
tree.remove(etc)?;
// .len() is also O(1)
assert_eq!(tree.len(), 4);
// Here are the basic hierarchical operators
assert_eq!(tree.get_parent(usr)?, Some(fs_root));
assert_eq!(
tree.get_children(usr).unwrap().collect::<Vec<NodeRef>>(),
vec![bin, lib],
);
// Iterate depth first over a node children.
// Use .depth_first() to iterate the entire tree.
for node in tree.depth_first_of(usr)? {
// ...
}