mirror of
https://github.com/AdrianKuta/Tree-Data-Structure.git
synced 2026-06-20 03:10:14 +02:00
Core additive work for v3.4 (non-breaking): - Rewrite nodeCount(), height(), clear() and the post-order iterator iteratively so deep/degenerate trees no longer throw StackOverflowError (verified to 50k deep). - Add lazy Sequence traversal: asSequence(order), pre/post/levelOrderSequence(). - Add navigation extensions: isLeaf, degree, root(), ancestors(), siblings(), leaves(), descendants(). - Add functional extensions: findNode, filterNodes, anyNode, allNodes, countNodes, foldNodes, mapValues, deepCopy, structurallyEquals (all stack-safe). - Add tests for stack-safety, the new APIs, and previously-uncovered height/depth/nodeCount/path (incl. exception paths). 40 tests green on JVM.
32 lines
1.5 KiB
Kotlin
32 lines
1.5 KiB
Kotlin
package com.github.adriankuta.datastructure.tree
|
|
|
|
import com.github.adriankuta.datastructure.tree.iterators.LevelOrderTreeIterator
|
|
import com.github.adriankuta.datastructure.tree.iterators.PostOrderTreeIterator
|
|
import com.github.adriankuta.datastructure.tree.iterators.PreOrderTreeIterator
|
|
import com.github.adriankuta.datastructure.tree.iterators.TreeNodeIterators
|
|
|
|
/**
|
|
* Lazily traverses this subtree in the given [order] as a [Sequence], without forcing the whole
|
|
* traversal up front. Pairs with the Kotlin stdlib, e.g.
|
|
* `root.asSequence().map { it.value }.firstOrNull { it == target }`.
|
|
*/
|
|
fun <T> TreeNode<T>.asSequence(
|
|
order: TreeNodeIterators = TreeNodeIterators.PreOrder,
|
|
): Sequence<TreeNode<T>> {
|
|
val self = this
|
|
return when (order) {
|
|
TreeNodeIterators.PreOrder -> Sequence { PreOrderTreeIterator(self) }
|
|
TreeNodeIterators.PostOrder -> Sequence { PostOrderTreeIterator(self) }
|
|
TreeNodeIterators.LevelOrder -> Sequence { LevelOrderTreeIterator(self) }
|
|
}
|
|
}
|
|
|
|
/** Lazy pre-order traversal as a [Sequence]. */
|
|
fun <T> TreeNode<T>.preOrderSequence(): Sequence<TreeNode<T>> = asSequence(TreeNodeIterators.PreOrder)
|
|
|
|
/** Lazy post-order traversal as a [Sequence]. */
|
|
fun <T> TreeNode<T>.postOrderSequence(): Sequence<TreeNode<T>> = asSequence(TreeNodeIterators.PostOrder)
|
|
|
|
/** Lazy level-order (breadth-first) traversal as a [Sequence]. */
|
|
fun <T> TreeNode<T>.levelOrderSequence(): Sequence<TreeNode<T>> = asSequence(TreeNodeIterators.LevelOrder)
|