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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3d5898bb2e8aaea4617747c5f4024ab023a1afeabba3abafeaf2b86bb6afa986
4
- data.tar.gz: c6651a33b8e66ee3528dc8ab3abf2359f3e2647fc27491e8bd5083ef08844d77
3
+ metadata.gz: 56ddd66545f9e423b96066b12deea8e22fc86b35b7a97be056ebf91f80543e77
4
+ data.tar.gz: 10a3ec88b0a5f5cb199ac96267d7665bfee99ab4fb9cf89488790fe798120b05
5
5
  SHA512:
6
- metadata.gz: e7d1619486160150a91842631953842f3bddcb90213d415ec9aaca846184220ada9494cdae1eadf05ae5d523c5646b1ce19590d0b60c9df8ddd0c0f01a40ede7
7
- data.tar.gz: ed2f20ab619e64c6daf16f4484fc52b0bc724e3b9b0f8b08c3a61921cbde5077f99beace823afbf3133c74ab3dfd838b48c5b09392bcaaee4fc0a930eb507589
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
@@ -2,5 +2,5 @@
2
2
 
3
3
  class RBTree
4
4
  # The version of the rbtree-ruby gem
5
- VERSION = "0.1.4"
5
+ VERSION = "0.1.5"
6
6
  end
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
- return if node == @nil_node
469
- traverse_asc(node.left, &block)
470
- yield node.key, node.value
471
- traverse_asc(node.right, &block)
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
- return if node == @nil_node
481
- traverse_desc(node.right, &block)
482
- yield node.key, node.value
483
- traverse_desc(node.left, &block)
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
- return if node == @nil_node
1170
- traverse_asc(node.left, &block)
1171
- node.value.each { |v| yield node.key, v }
1172
- traverse_asc(node.right, &block)
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
- return if node == @nil_node
1177
- traverse_desc(node.right, &block)
1178
- node.value.reverse_each { |v| yield node.key, v }
1179
- traverse_desc(node.left, &block)
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)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rbtree-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masahito Suzuki