Skip to content

Commit

Permalink
refactor: 💡 extract tree traversal methods to new class
Browse files Browse the repository at this point in the history
  • Loading branch information
Xanonymous-GitHub committed Jul 17, 2024
1 parent 7494945 commit ae03634
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 35 deletions.
43 changes: 8 additions & 35 deletions core/src/main/kotlin/tw/xcc/gumtree/model/GumTree.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@ package tw.xcc.gumtree.model
import tw.xcc.gumtree.api.tree.Comparable
import tw.xcc.gumtree.api.tree.Traversable

class GumTree : BasicTree<GumTree>(), Traversable<GumTree>, Comparable<GumTree> {
class GumTree :
BasicTree<GumTree>(),
Traversable<GumTree>,
Comparable<GumTree> {
private val traversalHelper = TraversalHelper(this)

fun insertChildAt(
pos: Int,
child: GumTree
Expand All @@ -24,41 +29,9 @@ class GumTree : BasicTree<GumTree>(), Traversable<GumTree>, Comparable<GumTree>
}
}

private fun preOrderedImpl(
tree: GumTree,
visited: MutableSet<GumTree>
) {
synchronized(tree) {
visited.add(tree)
tree.children.forEach {
preOrderedImpl(it, visited)
}
}
}

override fun preOrdered(): List<GumTree> {
val visited = mutableSetOf<GumTree>()
preOrderedImpl(this, visited)
return visited.toList()
}
override fun preOrdered(): List<GumTree> = traversalHelper.preOrdered()

private fun postOrderedImpl(
tree: GumTree,
visited: MutableSet<GumTree>
) {
synchronized(tree) {
tree.children.forEach {
postOrderedImpl(it, visited)
}
visited.add(tree)
}
}

override fun postOrdered(): List<GumTree> {
val visited = mutableSetOf<GumTree>()
postOrderedImpl(this, visited)
return visited.toList()
}
override fun postOrdered(): List<GumTree> = traversalHelper.postOrdered()

override infix fun isIsomorphicTo(other: GumTree): Boolean {
TODO("Not yet implemented")
Expand Down
44 changes: 44 additions & 0 deletions core/src/main/kotlin/tw/xcc/gumtree/model/TraversalHelper.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package tw.xcc.gumtree.model

import tw.xcc.gumtree.api.tree.Traversable
import tw.xcc.gumtree.api.tree.Tree

class TraversalHelper<T>(
private val tree: T
) : Traversable<T> where T : Tree<T>, T : Any {
private fun preOrderedImpl(
tree: T,
visited: MutableSet<T>
) {
visited.add(tree)
tree.children.forEach {
preOrderedImpl(it, visited)
}
}

private fun postOrderedImpl(
tree: T,
visited: MutableSet<T>
) {
tree.children.forEach {
postOrderedImpl(it, visited)
}
visited.add(tree)
}

override fun preOrdered(): List<T> {
synchronized(tree) {
val visited = mutableSetOf<T>()
preOrderedImpl(tree, visited)
return visited.toList()
}
}

override fun postOrdered(): List<T> {
synchronized(tree) {
val visited = mutableSetOf<T>()
postOrderedImpl(tree, visited)
return visited.toList()
}
}
}

0 comments on commit ae03634

Please sign in to comment.