LeetCode in Kotlin

2196. Create Binary Tree From Descriptions

Medium

You are given a 2D integer array descriptions where descriptions[i] = [parenti, childi, isLefti] indicates that parenti is the parent of childi in a binary tree of unique values. Furthermore,

Construct the binary tree described by descriptions and return its root.

The test cases will be generated such that the binary tree is valid.

Example 1:

Input: descriptions = [[20,15,1],[20,17,0],[50,20,1],[50,80,0],[80,19,1]]

Output: [50,20,80,15,17,19]

Explanation: The root node is the node with value 50 since it has no parent.

The resulting binary tree is shown in the diagram.

Example 2:

Input: descriptions = [[1,2,1],[2,3,0],[3,4,1]]

Output: [1,2,null,null,3,4]

Explanation: The root node is the node with value 1 since it has no parent.

The resulting binary tree is shown in the diagram.

Constraints:

Solution

import com_github_leetcode.TreeNode

/*
 * Example:
 * var ti = TreeNode(5)
 * var v = ti.`val`
 * Definition for a binary tree node.
 * class TreeNode(var `val`: Int) {
 *     var left: TreeNode? = null
 *     var right: TreeNode? = null
 * }
 */
class Solution {
    fun createBinaryTree(descriptions: Array<IntArray>): TreeNode? {
        val map: MutableMap<Int, Data> = HashMap()
        for (description in descriptions) {
            var data = map[description[0]]
            if (data == null) {
                data = Data()
                data.node = TreeNode(description[0])
                data.isHead = true
                map[description[0]] = data
            }
            var childData = map[description[1]]
            if (childData == null) {
                childData = Data()
                childData.node = TreeNode(description[1])
                map[childData.node!!.`val`] = childData
            }
            childData.isHead = false
            if (description[2] == 1) {
                data.node!!.left = childData.node
            } else {
                data.node!!.right = childData.node
            }
        }
        for ((_, value) in map) {
            if (value.isHead) {
                return value.node
            }
        }
        return null
    }

    private class Data {
        var node: TreeNode? = null
        var isHead = false
    }
}