📜  数据结构 |二叉树 |问题 15(1)

📅  最后修改于: 2023-12-03 15:10:19.552000             🧑  作者: Mango

数据结构 | 二叉树 | 问题 15

什么是二叉树?

二叉树是一种树形结构,每个节点最多只有两个子节点,分别称为左子节点和右子节点。它可以为空,或者由一个根节点以及若干个左子树和右子树组成。二叉树的遍历方式有前序遍历、中序遍历、后序遍历以及层次遍历。

问题 15:二叉树的层次遍历 II
问题描述

给定一个二叉树,返回其中每层的节点值(从叶子节点到根节点的顺序)。

例如:

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

    3
   / \
  9  20
    /  \
   15   7

返回其自底向上的层次遍历结果:

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

首先通过层次遍历得到二叉树从上到下每一层的节点值,然后将它们反转即可得到从下到上每一层的节点值。可以使用队列来实现层次遍历。

  1. 创建一个队列和一个二维列表,分别用来存放节点和节点值。
  2. 将根节点入队。
  3. 循环直到队列为空:
    • 记录当前队列长度,这代表当前层的节点数。
    • 创建一个列表,用来存放当前层的节点值。
    • 循环当前层的节点数次:
      • 将队首节点出队,并将其值添加到当前层列表中。
      • 如果它有左子节点,将其入队。
      • 如果它有右子节点,将其入队。
    • 将当前层列表添加到二维列表中。
  4. 将二维列表反转即可得到自底向上的层次遍历结果。
代码实现

Python 代码:

class Solution:
    def levelOrderBottom(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []

        queue, res = collections.deque([root]), []
        while queue:
            level_size = len(queue)
            level = []
            for _ in range(level_size):
                node = queue.popleft()
                level.append(node.val)
                if node.left:
                    queue.append(node.left)
                if node.right:
                    queue.append(node.right)
            res.append(level)
        return res[::-1]

Java 代码:

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if (root == null) {
            return res;
        }

        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            int levelSize = queue.size();
            List<Integer> level = new ArrayList<>();
            for (int i = 0; i < levelSize; i++) {
                TreeNode node = queue.poll();
                level.add(node.val);
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            res.add(level);
        }

        Collections.reverse(res);
        return res;
    }
}

以上就是对于问题 15:二叉树的层次遍历 II 的介绍和实现。