Kyaria

Tree

Jun 25th, 2019
7,122
0
Never
2
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.64 KB | None | 0 0
  1. sealed class Tree {
  2.  
  3.     abstract fun size(): Int
  4.     abstract fun playtime(): Int
  5.  
  6.     fun addSorted(valueSong: Song, comp: Comparator<Song>): Tree = when (this) {
  7.         is EmptyTree -> DataNode(valueSong)
  8.         is DataNode -> if (0 <= comp.compare(valueSong, this.songValue))
  9.             DataNode(songValue, left.addSorted(valueSong, comp), right)
  10.         else
  11.             DataNode(songValue, left, right.addSorted(valueSong, comp))
  12.     }
  13.  
  14.     fun forEachSong(f: (v: Song) -> Unit) {
  15.         when (this) {
  16.             is EmptyTree -> {}
  17.             is DataNode -> f(this.songValue)
  18.         }
  19.     }
  20.  
  21.     abstract fun processPreOrder(f: (v: Song) -> Unit)
  22.     abstract fun processPostOrder(f: (v: Song) -> Unit)
  23.     abstract fun processInOrder(f: (v: Song) -> Unit)
  24. }
  25.  
  26. object EmptyTree : Tree() {
  27.  
  28.     override fun size(): Int = 0
  29.  
  30.     override fun playtime(): Int = 0
  31.  
  32.     override fun processPreOrder(f: (v: Song) -> Unit) {}
  33.     override fun processPostOrder(f: (v: Song) -> Unit) {}
  34.     override fun processInOrder(f: (v: Song) -> Unit) {}
  35. }
  36.  
  37. class DataNode(val songValue: Song, val left: Tree = EmptyTree, val right: Tree = EmptyTree) : Tree() {
  38.  
  39.     override fun size(): Int = left.size() + 1 + right.size()
  40.  
  41.     override fun playtime(): Int = left.playtime() + this.songValue.spieldauer + right.playtime()
  42.  
  43.     override fun processPreOrder(f: (v: Song) -> Unit) {
  44.         forEachSong(f) // Diesen Knoten zuerst verarbeiten
  45.         left.processPreOrder(f) // dann den gesamten linken und
  46.         right.processPreOrder(f) // rechten Teilbaum verarbeiten
  47.     }
  48.  
  49.     override fun processPostOrder(f: (v: Song) -> Unit) {
  50.         left.processPostOrder(f) // Erst den linken, dann den
  51.         right.processPostOrder(f) // rechten Teilbaum vollständig verarbeiten
  52.         forEachSong(f) // am Ende den Knoten selbst verarbeiten
  53.     }
  54.  
  55.     override fun processInOrder(f: (v: Song) -> Unit) {
  56.         left.processInOrder(f) // erst den linken Teilbaum verarbeiten
  57.         forEachSong(f) // diesen Knoten verarbeiten
  58.         right.processInOrder(f) // rechten Teilbaum verarbbeiten
  59.     }
  60. }
  61.  
  62. class SongTreeContainer(val songliste: MutableList<Song>, comp: Comparator<Song>) {
  63.  
  64.     var songTreeRoot: Tree = EmptyTree
  65.  
  66.     init {
  67.         for (x in songliste) {
  68.             songTreeRoot = songTreeRoot.addSorted(x, comp)
  69.         }
  70.     }
  71.  
  72.     fun size() = songTreeRoot.size()
  73.  
  74.     fun playtime() = songTreeRoot.playtime()
  75.  
  76.     fun addSorted(valueSong: Song, comp: Comparator<Song>){
  77.         songTreeRoot = songTreeRoot.addSorted(valueSong, comp)
  78.     }
  79.  
  80.     fun forEachSong(f: (v: Song) -> Unit) = songTreeRoot.processInOrder(f)
  81. }
Advertisement