每日算法題—二叉樹的層平均值

題目

給定一個(gè)非空二叉樹, 返回一個(gè)由每層節(jié)點(diǎn)平均值組成的數(shù)組
來(lái)源:https://leetcode-cn.com/problems/average-of-levels-in-binary-tree/
例如輸入:

輸出: [1, 2.5, 7.5]

思路

方法1:使用map,遞歸將每個(gè)node的層級(jí)和節(jié)點(diǎn)值存入map中,最后再遍歷map,將map中記錄的節(jié)點(diǎn)值求個(gè)平均即可
方法2:使用隊(duì)列,逐層遍歷,具體邏輯看代碼注釋

實(shí)現(xiàn)

方法1:

    fun averageOfLevels(root: TreeNode?):DoubleArray {
        val resultMap = HashMap<Int, ArrayList<Int>>()//用來(lái)記錄節(jié)點(diǎn)所在層級(jí)和該層級(jí)的所有節(jié)點(diǎn)值
        recursion(root, 0, resultMap)//遞歸,將樹的所有節(jié)點(diǎn)的層級(jí)和值都記錄到map中
        val result = DoubleArray(resultMap.size)
        for ((key, value) in resultMap) {//遍歷map,求出每層的平均值
            result[key] = value.average()
        }
        return result
    }

    fun recursion(node: TreeNode?, level: Int, hashMap: HashMap<Int, ArrayList<Int>>) {
        node?.let {
            val l = hashMap[level]
            if (l != null) {
                l.add(it.value)
            } else {
                hashMap[level] = arrayListOf(it.value)
            }
            recursion(it.left, level + 1, hashMap)//孩子節(jié)點(diǎn)的層級(jí)比當(dāng)前層級(jí)多1層,所以要加1
            recursion(it.right, level + 1, hashMap)
        }
    }

方法2:

fun averageOfLevels(root: TreeNode?):DoubleArray {
        val result = ArrayList<Double>()
        val queue = LinkedList<TreeNode>()
        var node: TreeNode
        var sum: Double
        var levelSize: Int
        root?.let {
            queue.push(it)
            while (!queue.isEmpty()) {
                sum = 0.0//記得每層計(jì)算完平均值后要把sum清0
                levelSize = queue.size//此時(shí)隊(duì)列中全部是處于同一個(gè)層級(jí)的節(jié)點(diǎn),記錄下個(gè)數(shù),之后依次彈出當(dāng)前層的所有節(jié)點(diǎn),并將下一層的節(jié)點(diǎn)入隊(duì)
                for (i in 0 until levelSize) {
                    node = queue.poll()
                    sum += node.value
                    node.left?.let { queue.offer(it) }//將同一層的節(jié)點(diǎn)入隊(duì)
                    node.right?.let { queue.offer(it) }//將同一層的節(jié)點(diǎn)入隊(duì)
                }
                result.add(sum / levelSize)
            }
        }
        return result.toDoubleArray()
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容