rbtree-ruby 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -0
- data/lib/rbtree/version.rb +1 -1
- data/lib/rbtree.rb +44 -16
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 56ddd66545f9e423b96066b12deea8e22fc86b35b7a97be056ebf91f80543e77
|
|
4
|
+
data.tar.gz: 10a3ec88b0a5f5cb199ac96267d7665bfee99ab4fb9cf89488790fe798120b05
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1d521a30299f8c3db327d1b671d84113cf3c9e5adc90a78747e76b7480ef02ceb95d813a90eeebadfd32e4b8360b2d43fffd1ed1ac4d9314d8368cbe137ce7aa
|
|
7
|
+
data.tar.gz: 445a6cf0a99efdd0b5b4dc41dd86ec219e784cc3a2ecf150b4467e2619bcb08bd9b47d119d1c5310f43fdecdd7dc19941c3bfa4ae9e7b68d2b359819336f0a97
|
data/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,15 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [0.1.5] - 2026-01-13
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
- **Iterative Traversal**: Replaced recursive tree traversal with iterative approach
|
|
12
|
+
- `each`, `reverse_each`, and other traversal methods now use an explicit stack
|
|
13
|
+
- Prevents `SystemStackError` (stack overflow) on extremely deep trees
|
|
14
|
+
- Slightly improves iteration performance by removing recursion overhead
|
|
15
|
+
- Applies to both `RBTree` and `MultiRBTree`
|
|
16
|
+
|
|
8
17
|
## [0.1.4] - 2026-01-13
|
|
9
18
|
|
|
10
19
|
### Changed
|
|
@@ -68,6 +77,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
68
77
|
- ASCII diagrams for tree rotation operations
|
|
69
78
|
- MIT License (Copyright © 2026 Masahito Suzuki)
|
|
70
79
|
|
|
80
|
+
[0.1.5]: https://github.com/firelzrd/rbtree-ruby/releases/tag/v0.1.5
|
|
71
81
|
[0.1.4]: https://github.com/firelzrd/rbtree-ruby/releases/tag/v0.1.4
|
|
72
82
|
[0.1.3]: https://github.com/firelzrd/rbtree-ruby/releases/tag/v0.1.3
|
|
73
83
|
[0.1.2]: https://github.com/firelzrd/rbtree-ruby/releases/tag/v0.1.2
|
data/lib/rbtree/version.rb
CHANGED
data/lib/rbtree.rb
CHANGED
|
@@ -465,10 +465,17 @@ class RBTree
|
|
|
465
465
|
# @yield [key, value] each key-value pair in ascending order
|
|
466
466
|
# @return [void]
|
|
467
467
|
def traverse_asc(node, &block)
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
468
|
+
stack = []
|
|
469
|
+
current = node
|
|
470
|
+
while current != @nil_node || !stack.empty?
|
|
471
|
+
while current != @nil_node
|
|
472
|
+
stack << current
|
|
473
|
+
current = current.left
|
|
474
|
+
end
|
|
475
|
+
current = stack.pop
|
|
476
|
+
yield current.key, current.value
|
|
477
|
+
current = current.right
|
|
478
|
+
end
|
|
472
479
|
end
|
|
473
480
|
|
|
474
481
|
# Traverses the tree in descending order (reverse in-order traversal).
|
|
@@ -477,10 +484,17 @@ class RBTree
|
|
|
477
484
|
# @yield [key, value] each key-value pair in descending order
|
|
478
485
|
# @return [void]
|
|
479
486
|
def traverse_desc(node, &block)
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
487
|
+
stack = []
|
|
488
|
+
current = node
|
|
489
|
+
while current != @nil_node || !stack.empty?
|
|
490
|
+
while current != @nil_node
|
|
491
|
+
stack << current
|
|
492
|
+
current = current.right
|
|
493
|
+
end
|
|
494
|
+
current = stack.pop
|
|
495
|
+
yield current.key, current.value
|
|
496
|
+
current = current.left
|
|
497
|
+
end
|
|
484
498
|
end
|
|
485
499
|
|
|
486
500
|
# Traverses nodes with keys less than the specified key.
|
|
@@ -1166,17 +1180,31 @@ class MultiRBTree < RBTree
|
|
|
1166
1180
|
private
|
|
1167
1181
|
|
|
1168
1182
|
def traverse_asc(node, &block)
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1183
|
+
stack = []
|
|
1184
|
+
current = node
|
|
1185
|
+
while current != @nil_node || !stack.empty?
|
|
1186
|
+
while current != @nil_node
|
|
1187
|
+
stack << current
|
|
1188
|
+
current = current.left
|
|
1189
|
+
end
|
|
1190
|
+
current = stack.pop
|
|
1191
|
+
current.value.each { |v| yield current.key, v }
|
|
1192
|
+
current = current.right
|
|
1193
|
+
end
|
|
1173
1194
|
end
|
|
1174
1195
|
|
|
1175
1196
|
def traverse_desc(node, &block)
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1197
|
+
stack = []
|
|
1198
|
+
current = node
|
|
1199
|
+
while current != @nil_node || !stack.empty?
|
|
1200
|
+
while current != @nil_node
|
|
1201
|
+
stack << current
|
|
1202
|
+
current = current.right
|
|
1203
|
+
end
|
|
1204
|
+
current = stack.pop
|
|
1205
|
+
current.value.reverse_each { |v| yield current.key, v }
|
|
1206
|
+
current = current.left
|
|
1207
|
+
end
|
|
1180
1208
|
end
|
|
1181
1209
|
|
|
1182
1210
|
def traverse_lt(node, key, &block)
|