13 个版本
0.4.2 | 2021 年 2 月 20 日 |
---|---|
0.4.1 | 2021 年 1 月 25 日 |
0.3.0 | 2020 年 2 月 21 日 |
0.2.1 | 2018 年 11 月 9 日 |
0.1.4 | 2018 年 5 月 26 日 |
#132 在 数据结构
71,431 每月下载量
在 100 个crate(直接使用 18 个)中使用
195KB
3.5K SLoC
此项目提供通用目的的树数据结构。
快速入门
没有耐心的读者可以从 表示法 开始。
功能
-
逐步 创建、读取、更新、删除 和迭代带有相关数据项的节点。
-
紧凑的表示法来表示树:
-
,/
编码或元组编码的树。 -
深度优先搜索游标。
-
广度优先搜索迭代器。
-
树可以分阶段构建,节点存储在内存中。
-
树可以一次性构建,节点存储在连续的内存中。
-
支持静态借用检查的独占所有权。
-
支持动态借用检查的共享所有权。
示例
-
文字树的表示法
use trees::tr; let scattered_tree = tr(0) /( tr(1)/tr(2)/tr(3) ) /( tr(4)/tr(5)/tr(6) ); let piled_tree = trees::Tree::from(( 0, (1,2,3), (4,5,6) ));
它们都编码了如下所示绘制的树
............. . 0 . . / \ . . 1 4 . . / \ / \ . .2 3 5 6. .............
-
使用树表示法来减少语法噪音,摘自crate
reflection_derive
,版本 0.1.1quote! { #( -( ::reflection::variant( stringify!( #vnames )) /( #( -( ::reflection::field( #fnames, <#ftypes1 as ::reflection::Reflection>::ty(), <#ftypes2 as ::reflection::Reflection>::name(), Some( <#ftypes3 as ::reflection::Reflection>::members ))) )* ) ) )* }
树操作的开始由
-(
和/(
表示,这足以让读者专注于数据部分。 -
如果树遍历是一个 "驱动轮"(你可以自己遍历树),请使用迭代器。
use trees::{Node, tr}; use std::fmt::Display; let tree = tr(0) /( tr(1) /tr(2)/tr(3) ) /( tr(4) /tr(5)/tr(6) ); fn tree_to_string<T:Display>( node: &Node<T> ) -> String { if node.has_no_child() { node.data.to_string() } else { format!( "{}( {})", node.data, node.iter().fold( String::new(), |s,c| s + &tree_to_string(c) + &" " )) } } assert_eq!( tree_to_string( &tree ), "0( 1( 2 3 ) 4( 5 6 ) )" );
-
当树遍历是一个 "被动轮"(由其他库驱动)时,请使用
TreeWalk
。摘自cratetsv
,版本 0.1.0fn next_value_seed<V:DeserializeSeed<'de>>( &mut self, seed: V ) -> Result<V::Value> { let result = self.next_element_in_row( seed )?; self.de.next_column(); self.de.row += 1; self.de.pop_stack(); // finish key-value pair self.de.next_column(); self.de.columns.revisit(); Ok( result ) }
当(反)序列化变量时,
serde
库在模式树上驱动。使用TreeWalk
方法,例如next_column
和revisit
来跟踪步骤。
许可证
根据您的意愿,在 Apache 许可证 2.0 或 MIT 许可证下。