Advertisement
Guest User

tree

a guest
Jul 15th, 2017
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 1.84 KB | None | 0 0
  1. data class Node<T>(val value: T, var left: Node<T>? = null, var right: Node<T>? = null)
  2.  
  3. interface TreeStrategy<T> {
  4.  
  5.     fun add(parent: Node<T>, node: Node<T>)
  6.  
  7. }
  8.  
  9. class ComparableComparator<T:Comparable<T>> : Comparator<T> {
  10.     override fun compare(o1: T, o2: T): Int = o1.compareTo(o2)
  11. }
  12.  
  13. class SimpleComparatorTreeStrategy<T>(val comparator: Comparator<T>) : TreeStrategy<T> {
  14.  
  15.     override fun add(parent: Node<T>, node: Node<T>) {
  16.         val compareResult = comparator.compare(parent.value, node.value)
  17.  
  18.         val parentLeft = parent.left
  19.         val parentRight = parent.right
  20.  
  21.         when {
  22.             compareResult.lessThanParent -> if(parentLeft != null) add(parentLeft, node) else parent.left = node
  23.             compareResult.moreThanParent -> if(parentRight != null) add(parentRight, node) else parent.right = node
  24.         }
  25.     }
  26.  
  27.     private val Int.moreThanParent: Boolean get() = this < 0
  28.     private val Int.lessThanParent: Boolean get() = this >= 0
  29.  
  30. }
  31.  
  32. class Tree<T>(val strategy: TreeStrategy<T>) {
  33.  
  34.     private var root: Node<T>? = null
  35.  
  36.     fun add(value: T) {
  37.         val root = root
  38.  
  39.         val node = Node(value)
  40.  
  41.         if (root == null) {
  42.             this.root = node
  43.         } else {
  44.             strategy.add(root, node)
  45.         }
  46.     }
  47.  
  48.     fun forEach(action: (T) -> Unit) {
  49.         root?.let { visit(it, action) }
  50.     }
  51.  
  52.     private fun visit(node: Node<T>, action: (T) -> Unit) {
  53.         node.left?.let { visit(it, action) }
  54.  
  55.         action(node.value)
  56.  
  57.         node.right?.let { visit(it, action) }
  58.     }
  59.  
  60. }
  61.  
  62. fun <T:Comparable<T>> treeOf(vararg values:T):Tree<T> = Tree<T>(SimpleComparatorTreeStrategy(ComparableComparator()))
  63.         .also { tree -> values.forEach(tree::add) }
  64.  
  65. fun main(args: Array<String>) {
  66.     treeOf("test1", "test2", "t", "abcd").forEach(::println)
  67. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement