August 27, 2024
P61 - Leaves and internal nodes of a binary tree.
A leaf is a node with no successors. Write a method leafCount to count them.
> Node("x", Node("x"), End).leafCount()
1
Write a method leafValues to collect leaf values into a list.
> Node("a", Node("b"), Node("c", Node("d"), Node("e"))).leafValues()
[b, d, e]
An internal node of a binary tree has either one or two non-empty successors. Write a method internalValues to collect their values into a list.
> Node("a", Node("b"), Node("c", Node("d"), Node("e"))).internalValues()
[a, c]
kotlin
package org.kotlin99.binarytrees
import com.natpryce.hamkrest.assertion.assertThat
import com.natpryce.hamkrest.equalTo
import org.junit.Test
import org.kotlin99.binarytrees.Tree.End
import org.kotlin99.binarytrees.Tree.Node
import org.kotlin99.common.containsAll
fun Tree<*>.leafCount(): Int = leafValues().size
fun <T> Tree<T>.leafValues(): List<T> = nodes()
.filter { it.left == End && it.right == End }
.map { it.value }
fun <T> Tree<T>.internalValues(): List<T> = nodes()
.filter { it.left != End || it.right != End }
.map { it.value }
class P61Test {
@Test fun `count tree leafs`() {
assertThat(Node("x").leafCount(), equalTo(1))
assertThat(Node("x", Node("x"), End).leafCount(), equalTo(1))
assertThat(Node("x", Node("x"), Node("x")).leafCount(), equalTo(2))
}
@Test fun `collect leaf values into a list`() {
assertThat(Node("a").leafValues(), equalTo(listOf("a")))
assertThat(Node("a", Node("b"), End).leafValues(), equalTo(listOf("b")))
assertThat(Node("a", Node("b"), Node("c")).leafValues(), containsAll("b", "c"))
assertThat(Node("a", Node("b"), Node("c", Node("d"), Node("e"))).leafValues(), containsAll("b", "d", "e"))
}
@Test fun `collect internal values into a list`() {
assertThat(Node("a").internalValues(), equalTo(emptyList()))
assertThat(Node("a", Node("b"), End).internalValues(), equalTo(listOf("a")))
assertThat(Node("a", Node("b"), Node("c")).internalValues(), equalTo(listOf("a")))
assertThat(Node("a", Node("b"), Node("c", Node("d"), Node("e"))).internalValues(), containsAll("a", "c"))
}
}