返回
初学者的 LeetCode 树形遍历指南:掌握二叉树的层次遍历 II
见解分享
2023-11-03 17:03:51
前言
在计算机科学中,树形数据结构因其有效组织和存储分层数据的特性而备受推崇。二叉树是一种特殊的树形结构,其中每个节点最多有两个子节点:左子节点和右子节点。层次遍历是遍历二叉树的一种常用技术,它按照层次从上到下访问每个节点。
107 题:二叉树的层次遍历 II
LeetCode 的 107 题要求你从底向上对一棵二叉树进行层次遍历,并返回结果。这意味着遍历将从最底层开始,逐层向上移动。
广度优先搜索 (BFS)
层次遍历二叉树的一个有效方法是使用广度优先搜索 (BFS) 算法。BFS 算法遵循先进先出的原则,这意味着它会首先访问队列中的第一个元素,然后依次访问后续元素。
Python 实现
def level_order_bottom(root):
if not root:
return []
result = []
queue = [root]
while queue:
level_size = len(queue)
current_level = []
for _ in range(level_size):
node = queue.pop(0)
current_level.append(node.val)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
result.insert(0, current_level)
return result
Java 实现
public List<List<Integer>> levelOrderBottom(TreeNode root) {
List<List<Integer>> result = new LinkedList<>();
if (root == null) {
return result;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int levelSize = queue.size();
List<Integer> currentLevel = new ArrayList<>();
for (int i = 0; i < levelSize; i++) {
TreeNode node = queue.poll();
currentLevel.add(node.val);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
result.add(0, currentLevel);
}
return result;
}
复杂度分析
- 时间复杂度:O(N),其中 N 是二叉树中的节点总数。BFS 算法需要遍历每个节点一次。
- 空间复杂度:O(N),因为在最坏的情况下,队列中可能存储所有节点。
结论
掌握二叉树的层次遍历 II 是解决 LeetCode 107 题的关键。通过使用广度优先搜索 (BFS) 算法,我们可以从底向上遍历二叉树,获得其节点值的层次遍历结果。通过理解 BFS 的工作原理,并结合 Python 或 Java 代码示例,你将能够轻松解决此问题并提升你的算法技能。