| Crates.io | im_ternary_tree |
| lib.rs | im_ternary_tree |
| version | 0.0.19 |
| created_at | 2021-11-01 06:40:05.743231+00 |
| updated_at | 2025-07-29 16:48:46.822297+00 |
| description | Structural sharing ternary tree, i.e. immutable data structure |
| homepage | https://github.com/calcit-lang/ternary-tree.rs/ |
| repository | https://github.com/calcit-lang/ternary-tree.rs/ |
| max_upload_size | |
| id | 475041 |
| size | 766,540 |
a variant of 2-3 tree, with enhancements on ternary branching, optimized with tricks like finger-tree.
t.pop_left() and t.push_right(..) is optimized to be amortized O(1) at best cases and O(log n) when restructuring involed.
Tree layout from 0 to 159 watch video or try live demo.

Docs https://docs.rs/im_ternary_tree/ .
use im_ternary_tree::TernaryTreeList;
println!("{}", TernaryTreeList::<usize>::from(&[]));
// assoc
let origin5 = [1, 2, 3, 4, 5];
let data5 = TernaryTreeList::from(&origin5);
let updated = data5.assoc(3, 10);
println!("{}", data5.format_inline());
println!("{}", updated.format_inline());
assert_eq!(updated.unsafe_get(3), 10);
方案设计的中文介绍 https://www.bilibili.com/video/BV1z44y1a7a6/
This library has special optimizations on push_right and pop_left with tricks from finger-tree.
And as its size grows, it always operates on a shallow branch at right end, wasting fewer nodes for indexing new elements, a random demo looks like:

Also the left branches are kept shallow on purpose so it can be cheaper in pop_left. This trick is inspired by finger-tree.
Benchmarks comparing TernaryTreeList with std::vec::Vec and std::collections::VecDeque show a clear performance profile. As an immutable data structure, TernaryTreeList has some overhead compared to its mutable counterparts, but offers significant advantages in specific scenarios.
push_right / drop_right (Appending/Popping from the tail):
Vec and VecDeque are significantly faster, as they are mutable and optimized for O(1) amortized operations at the tail.TernaryTreeList is slower due to the nature of immutable structures, which require creating new tree nodes.push_left / drop_left (Prepending/Popping from the head):
TernaryTreeList is dramatically faster than Vec. Vec::insert(0, ...) is an O(n) operation, while TernaryTreeList's finger-tree-inspired optimizations make head operations much more efficient.VecDeque is still the fastest, as it is a mutable data structure specifically designed for O(1) head and tail operations.Conclusion:
TernaryTreeList when:
Vec or VecDeque when:
pop_right.MIT