leetcode107. 二叉树的层序遍历 II|刷题打卡

89 阅读1分钟

leetcode107. 二叉树的层序遍历 II

题目描述:

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

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

    3
   / \
  9  20
    /  \
   15   7

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

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

代码模版(swift)

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public var val: Int
 *     public var left: TreeNode?
 *     public var right: TreeNode?
 *     public init() { self.val = 0; self.left = nil; self.right = nil; }
 *     public init(_ val: Int) { self.val = val; self.left = nil; self.right = nil; }
 *     public init(_ val: Int, _ left: TreeNode?, _ right: TreeNode?) {
 *         self.val = val
 *         self.left = left
 *         self.right = right
 *     }
 * }
 */
class Solution {
    func levelOrderBottom(_ root: TreeNode?) -> [[Int]] {

    }
}

思路(树的深度遍历)

将树从左至右进行深度遍历,每次遍历添加至对应深度的数组中,然后数组反转,即可得到倒序层次遍历。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public var val: Int
 *     public var left: TreeNode?
 *     public var right: TreeNode?
 *     public init(_ val: Int) {
 *         self.val = val
 *         self.left = nil
 *         self.right = nil
 *     }
 * }
 */
class Solution {
    var ans107 = [[Int]]()
    func levelOrderBottom(_ root: TreeNode?) -> [[Int]] { // 107. 二叉树的层次遍历 II
        if root == nil {
            return []
        }
        levelOrderBottomDFS(root!, 0) //从最上层开始遍历
        return ans107.reversed() // 正常遍历反转为答案值
    }
    
    func levelOrderBottomDFS(_ node: TreeNode, _ degree: Int) { // 入参:节点和树深度
       if ans107.count <= degree {
            ans107.append([Int]()) // 若答案数组中没有对应下表数组,创建一个
        }
        ans107[degree].append(node.val) // 将对应深度数组加入节点值
        if node.left != nil {
            levelOrderBottomDFS(node.left!, degree + 1) // 左子树深度遍历,深度+1
        }
        if node.right != nil {
            levelOrderBottomDFS(node.right!, degree + 1) // 右子树深度遍历,深度+1
        }
    }
}

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