[LeetCode107. 二叉树的层序遍历 II] | 刷题打卡

179 阅读2分钟

一、题目描述:

给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

例如: 给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其自底向上的层序遍历为:

[
  [15,7],
  [9,20],
  [3]
]

二、思路分析:

这题和102. 二叉树的层序遍历非常相似。 如果选择投机的办法,直接使用102的代码做一个微调就可以了,102的要求是自顶向下,本题的要求是自底向上。只需要在添加行数据时,每次添加到result数组index==0的位置就可以了。时间复杂度和空间复杂度依然是O(n)。

那有没有办法使用dfs的方式获取获取层序遍历的结果? 当然是可以的,深度遍历时只需要标记当前遍历的节点在哪一层,将当前节点添加到二维数组对应的行中就可以了。 时间复杂度和控件复杂度都是O(n)。

三、AC 代码:

这里分别使用dfs和bfs两种解法

class Solution {
    fun levelOrderBottom(root: TreeNode?): List<List<Int>> {
        return solution2(root)
    }

    fun solution2(root: TreeNode?): List<List<Int>> {
        var result = mutableListOf<ArrayList<Int>>()
        dfs(root, result, 0)
        result.reverse()
        return result
    }

    fun dfs(root: TreeNode?, res: MutableList<ArrayList<Int>>, level: Int) {
        if (root == null)
            return
        if (level >= res.size) {
            var list = mutableListOf<Int>()
            res.add(list as ArrayList<Int>)
        }

        res[level].add(root.`val`)
        dfs(root.left, res, level + 1)
        dfs(root.right, res, level + 1)
    }

    // 层序遍历
    fun solution1(root: TreeNode?): List<List<Int>> {
        var result = mutableListOf<List<Int>>()
        if (root == null) {
            return result
        }
        var queue = LinkedList<TreeNode>()
        queue.push(root)
        var list = mutableListOf<TreeNode>()
        while (queue.isNotEmpty()) {
            list.addAll(queue)
            queue.clear()
            var level = mutableListOf<Int>()
            for (item in list) {
                level.add(item.`val`)
                if (item.left != null) {
                    queue.add(item.left!!)
                }
                if (item.right != null) {
                    queue.add(item.right!!)
                }
            }
            result.add(0, level)
            list.clear()
        }

        return result
    }
}

四、总结:

层序遍历不单单可以使用广搜,也可以使用深度搜索。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看活动详情