https://leetcode.com/problems/average-of-levels-in-binary-tree Easy

Решение

class Solution {
    fun averageOfLevels(root: TreeNode?): List<Double> {
        if (root == null) return emptyList()
        val res = ArrayList<Double>()
        var cap = 1024
        var q = arrayOfNulls<TreeNode>(cap)
        var head = 0
        var tail = 0
        var size = 0
        fun en(x: TreeNode) {
            if (size == cap) {
                val nq = arrayOfNulls<TreeNode>(cap shl 1)
                var i = 0
                while (i < size) {
                    nq[i] = q[(head + i) and (cap - 1)]
                    i++
                }
                q = nq
                cap = cap shl 1
                head = 0
                tail = size
            }
            q[tail] = x
            tail = (tail + 1) and (cap - 1)
            size++
        }
        fun de(): TreeNode {
            val x = q[head]!!
            q[head] = null
            head = (head + 1) and (cap - 1)
            size--
            return x
        }
        en(root)
        while (size > 0) {
            val level = size
            var sum = 0L
            var i = 0
            while (i < level) {
                val n = de()
                sum += n.`val`
                n.left?.let { en(it) }
                n.right?.let { en(it) }
                i++
            }
            res.add(sum.toDouble() / level)
        }
        return res
    }
}