mirror of
https://github.com/AdrianKuta/Tree-Data-Structure.git
synced 2026-06-20 03:10:14 +02:00
feat: stack-safe traversal + lazy Sequence + navigation/functional extensions
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.
This commit is contained in:
@@ -0,0 +1,54 @@
|
||||
package com.github.adriankuta.datastructure.tree
|
||||
|
||||
import com.github.adriankuta.datastructure.tree.exceptions.TreeNodeException
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertContentEquals
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertFailsWith
|
||||
|
||||
class TreeNodeUtilitiesTest {
|
||||
|
||||
private val root = TreeNode(1)
|
||||
private val a = TreeNode(2)
|
||||
private val b = TreeNode(3)
|
||||
|
||||
init {
|
||||
root.addChild(a)
|
||||
a.addChild(b)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun nodeCountCountsDescendantsExcludingRoot() {
|
||||
assertEquals(0, TreeNode("solo").nodeCount())
|
||||
assertEquals(2, root.nodeCount())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun heightIsLongestEdgePathToLeaf() {
|
||||
assertEquals(0, TreeNode("solo").height())
|
||||
assertEquals(2, root.height())
|
||||
assertEquals(1, a.height())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun depthIsDistanceToRoot() {
|
||||
assertEquals(0, root.depth())
|
||||
assertEquals(1, a.depth())
|
||||
assertEquals(2, b.depth())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun pathReturnsDescendantToReceiverChain() {
|
||||
assertContentEquals(listOf(b, a, root), root.path(b))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun pathThrowsWhenNotADescendant() {
|
||||
assertFailsWith<TreeNodeException> { root.path(TreeNode(99)) }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun pathThrowsWhenDescendantIsRootItself() {
|
||||
assertFailsWith<TreeNodeException> { root.path(root) }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user