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数据结构

Download history 15943/week @ 2024-03-14 17412/week @ 2024-03-21 17232/week @ 2024-03-28 19437/week @ 2024-04-04 19277/week @ 2024-04-11 22048/week @ 2024-04-18 19489/week @ 2024-04-25 18411/week @ 2024-05-02 18471/week @ 2024-05-09 15353/week @ 2024-05-16 13655/week @ 2024-05-23 17921/week @ 2024-05-30 18501/week @ 2024-06-06 18455/week @ 2024-06-13 16649/week @ 2024-06-20 14116/week @ 2024-06-27

71,431 每月下载量
100 个crate(直接使用 18 个)中使用

MIT/Apache

195KB
3.5K SLoC

此项目提供通用目的的树数据结构。

快速入门

没有耐心的读者可以从 表示法 开始。

功能

  1. 逐步 创建、读取、更新、删除 和迭代带有相关数据项的节点。

  2. 紧凑的表示法来表示树:-/ 编码或元组编码的树。

  3. 深度优先搜索游标。

  4. 广度优先搜索迭代器。

  5. 树可以分阶段构建,节点存储在内存中。

  6. 树可以一次性构建,节点存储在连续的内存中。

  7. 支持静态借用检查的独占所有权。

  8. 支持动态借用检查的共享所有权。

示例

  • 文字树的表示法

    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.1

    quote! {
        #(
            -( ::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。摘自crate tsv版本 0.1.0

        fn 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_columnrevisit 来跟踪步骤。

许可证

根据您的意愿,在 Apache 许可证 2.0 或 MIT 许可证下。

无运行时依赖项

功能