#tree #tree-traversal #tree-node #flat #vec #apl

tree-flat

TreeFlat 是为 Rust 构建和遍历前序树的最简单方式。

4 个版本

0.1.3 2023年4月25日
0.1.2 2022年11月6日
0.1.1 2022年3月12日
0.1.0 2022年3月1日

#791 in 数据结构

每月 43 次下载

MIT/Apache

35KB
630

TreeFlat 是为 Rust 构建和遍历前序树的最简单方式。

Alpha 版本!

如果你以前序方式构建并显示 Tree,那么这就是你的树。

无额外冗余,只是一个简单且高效的单一技巧马。

注意:树依赖于构建顺序,因此无法以不同的顺序重新排序树(更改父级或层级)。因此,例如,你不能在中间添加一个分支(只能添加在末尾之后...)。

工作原理

它不是创建节点指针的树、嵌套枚举或基于嵌套 Arena-based ids 的树,而只是存储树的表示

. Users
├── jhon_doe
   ├── file1.rs
   ├── file2.rs
├── jane_doe
└────── cat.jpg

... 在三个向量中按前序扁平化,这些向量存储数据、级别和父级

数据 用户 jhon_doe file1.rs file2.rs jane_doe cat.jpg
层级 0 1 2 2 1 2
父级 0 0 1 1 0 4

这允许在最常见的操作(关键:推入项 + 迭代)上获得 Rust Vec 的性能,并且非常有效地迭代 node::Node::parents/node::Node::children/node::Node::siblings,因为它只需遍历扁平向量。

迭代器利用这些观察结果

  • 子节点在父节点的右侧/上方
  • 父节点在子节点的左侧/下方
  • 兄弟节点在同一个层级上

因此,在导航 jhon_doe 的子节点的情况下

. Users			  ⇡ parents
├── jhon_doe		Index: 1, Level: 1
			   children start at 
				jhon_doe + 1,
				level 	 > jhon_doe
├   ├── file1.rs	: Level 2 is child!
   ├── file2.rs	: Level 2 is child!
├── jane_doe		: Level 1 is below, stop!
└────── cat.jpg

有了这个,你不需要搜索可能很大的数组,可以直接跳过节点并迭代直到节点上方!。

示例

use tree_flat::prelude::*;

let mut tree = Tree::with_capacity("Users", 6);

let mut root = tree.tree_root_mut();

let mut child = root.push("jhon_doe");
child.push("file1.rs");
child.push("file2.rs");

let mut child = root.push("jane_doe");
child.push("cat.jpg");

//The data is backed by vectors and arena-like ids on them:
assert_eq!(
   tree.as_data(),
   ["Users", "jhon_doe", "file1.rs", "file2.rs", "jane_doe", "cat.jpg",]
);
assert_eq!(tree.as_level(), [0, 1, 2, 2, 1, 2,]);
assert_eq!(tree.as_parents(), [0, 0, 1, 1, 0, 4,]);
//Pretty print the tree
println!("{}", tree);

// Iterations is as inserted:
for f in &tree {
  dbg!(f);
}

更多信息请访问我的 博客 .


受演讲启发

“高性能树处理,APL 方式” -- Aaron Hsu - APL Wiki

🤝 贡献

欢迎贡献、问题和功能请求!

表达你的支持

如果你喜欢这个项目!或者想要帮助使我的项目成为现实,请考虑通过https://www.buymeacoffee.com/mamcx捐赠或赞助我的工作。

📝 许可证

本项目双许可,许可协议为MIT & APACHE

无运行时依赖