21: Added path function to TreeNode (#22)

Path refers to the sequence of nodes along the edges of a tree.
This commit is contained in:
Adrian Kuta 2023-02-22 14:29:22 +01:00 committed by GitHub
parent 8a4e677ebf
commit 4aacbc9dbc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 79 additions and 7 deletions

View File

@ -135,7 +135,11 @@ kotlin {
implementation(kotlin("test"))
}
}
val jvmMain by getting
val jvmMain by getting {
dependencies {
implementation(kotlin("script-runtime"))
}
}
val jvmTest by getting
val jsMain by getting
val jsTest by getting

View File

@ -1,11 +1,17 @@
package com.github.adriankuta.datastructure.tree
import com.github.adriankuta.datastructure.tree.TreeNodeIterators.*
import com.github.adriankuta.datastructure.tree.exceptions.TreeNodeException
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
import com.github.adriankuta.datastructure.tree.iterators.TreeNodeIterators.*
import kotlin.jvm.JvmSynthetic
open class TreeNode<T>(val value: T) : Iterable<TreeNode<T>>, ChildDeclarationInterface<T> {
private var _parent: TreeNode<T>? = null
/**
* The converse notion of a child, an immediate ancestor.
*/
@ -13,12 +19,20 @@ open class TreeNode<T>(val value: T) : Iterable<TreeNode<T>>, ChildDeclarationIn
get() = _parent
private val _children = mutableListOf<TreeNode<T>>()
/**
* A group of nodes with the same parent.
*/
val children: List<TreeNode<T>>
get() = _children
/**
* Checks whether the current tree node is the root of the tree
* @return `true` if the current tree node is root of the tree, `false` otherwise.
*/
val isRoot: Boolean
get() = _parent == null
/**
* Choose one of available iterators from [TreeNodeIterators]
*/
@ -37,7 +51,8 @@ open class TreeNode<T>(val value: T) : Iterable<TreeNode<T>>, ChildDeclarationIn
@JvmSynthetic
override fun child(value: T, childDeclaration: ChildDeclaration<T>?): TreeNode<T> {
val newChild = TreeNode(value)
if(childDeclaration != null)
newChild._parent = this
if (childDeclaration != null)
newChild.childDeclaration()
_children.add(newChild)
return newChild
@ -91,6 +106,31 @@ open class TreeNode<T>(val value: T) : Iterable<TreeNode<T>>, ChildDeclarationIn
return depth
}
/**
* Returns the collection of nodes, which connect the current node
* with its descendants
*
* @param descendant the bottom child node for which the path is calculated
* @return collection of nodes, which connect the current node with its descendants
* @throws TreeNodeException exception that may be thrown in case if the
* current node does not have such descendant or if the
* specified tree node is root
*/
@Throws(TreeNodeException::class)
fun path(descendant: TreeNode<T>): List<TreeNode<T>> {
val path = mutableListOf<TreeNode<T>>()
var node = descendant
path.add(node)
while (!node.isRoot) {
node = node.parent!!
path.add(node)
if (node == this)
return path
}
throw TreeNodeException("The specified tree node $descendant is not the descendant of tree node $this")
}
/**
* Remove all children from root and every node in tree.
*/

View File

@ -1,5 +1,6 @@
package com.github.adriankuta.datastructure.tree
import com.github.adriankuta.datastructure.tree.iterators.TreeNodeIterators
import kotlin.jvm.JvmSynthetic
typealias ChildDeclaration<T> = ChildDeclarationInterface<T>.() -> Unit

View File

@ -0,0 +1,6 @@
package com.github.adriankuta.datastructure.tree.exceptions
import kotlin.jvm.JvmOverloads
class TreeNodeException @JvmOverloads constructor(message: String? = null, cause: Throwable? = null) :
RuntimeException(message, cause)

View File

@ -1,4 +1,6 @@
package com.github.adriankuta.datastructure.tree
package com.github.adriankuta.datastructure.tree.iterators
import com.github.adriankuta.datastructure.tree.TreeNode
/**
* Tree is iterated by using `Level-order Traversal Algorithm"

View File

@ -1,4 +1,6 @@
package com.github.adriankuta.datastructure.tree
package com.github.adriankuta.datastructure.tree.iterators
import com.github.adriankuta.datastructure.tree.TreeNode
/**
* Tree is iterated by using `Post-order Traversal Algorithm"

View File

@ -1,4 +1,6 @@
package com.github.adriankuta.datastructure.tree
package com.github.adriankuta.datastructure.tree.iterators
import com.github.adriankuta.datastructure.tree.TreeNode
/**
* Tree is iterated by using `Pre-order Traversal Algorithm"

View File

@ -1,4 +1,4 @@
package com.github.adriankuta.datastructure.tree
package com.github.adriankuta.datastructure.tree.iterators
/**
* @see PreOrder

View File

@ -1,5 +1,6 @@
package com.github.adriankuta.datastructure.tree
import com.github.adriankuta.datastructure.tree.iterators.TreeNodeIterators
import kotlin.test.Test
import kotlin.test.assertContentEquals
import kotlin.test.assertEquals

View File

@ -0,0 +1,14 @@
import com.github.adriankuta.datastructure.tree.tree
val root =
tree("World") {
child("North America") {
child("USA")
}
child("Europe") {
child("Poland")
child("Germany")
}
}
print(root.prettyString())