数据结构与算法之 leetcode 二叉树层序遍历优化 迭代法实现

数据结构与算法阿木 发布于 4 天前 1 次阅读


二叉树层序遍历优化:迭代法实现

二叉树是计算机科学中常见的一种数据结构,它由节点组成,每个节点最多有两个子节点。层序遍历是二叉树遍历的一种方式,它按照从上到下、从左到右的顺序访问树中的所有节点。在LeetCode等编程竞赛平台中,二叉树的层序遍历是一个常见的题目。本文将围绕二叉树层序遍历的优化,特别是迭代法实现,展开讨论。

基础层序遍历

在介绍迭代法之前,我们先回顾一下传统的层序遍历方法——递归法。

python

from collections import deque

class TreeNode:


def __init__(self, val=0, left=None, right=None):


self.val = val


self.left = left


self.right = right

def levelOrder(root):


if not root:


return []



result = []


queue = deque([root])



while queue:


level_size = len(queue)


current_level = []



for _ in range(level_size):


node = queue.popleft()


current_level.append(node.val)



if node.left:


queue.append(node.left)


if node.right:


queue.append(node.right)



result.append(current_level)



return result


这段代码使用了队列(deque)来存储待访问的节点,并按照层序遍历的规则进行访问。递归法简单易懂,但它的缺点是当树非常深时,可能会导致栈溢出。

迭代法优化

为了解决递归法可能导致的栈溢出问题,我们可以使用迭代法来实现层序遍历。迭代法通常使用栈或队列来实现,这里我们使用队列来实现。

python

from collections import deque

class TreeNode:


def __init__(self, val=0, left=None, right=None):


self.val = val


self.left = left


self.right = right

def levelOrderIterative(root):


if not root:


return []



result = []


queue = deque([root])



while queue:


level_size = len(queue)


current_level = []



for _ in range(level_size):


node = queue.popleft()


current_level.append(node.val)



if node.left:


queue.append(node.left)


if node.right:


queue.append(node.right)



result.append(current_level)



return result


这段代码与递归法类似,但去掉了递归调用。它使用一个队列来存储待访问的节点,并在每次循环中处理当前层的所有节点。这种方法不会受到栈大小的限制,因此可以处理更深的树。

优化与性能分析

在迭代法中,我们可以进一步优化性能,例如:

1. 避免重复添加节点:在添加子节点到队列时,我们可以检查节点是否为空,以避免重复添加。

2. 使用双端队列:在某些情况下,使用双端队列(deque)可以提高性能,因为它允许在两端进行高效的插入和删除操作。

下面是优化后的代码:

python

from collections import deque

class TreeNode:


def __init__(self, val=0, left=None, right=None):


self.val = val


self.left = left


self.right = right

def levelOrderOptimized(root):


if not root:


return []



result = []


queue = deque([root])



while queue:


level_size = len(queue)


current_level = []



for _ in range(level_size):


node = queue.popleft()


current_level.append(node.val)



if node.left:


queue.append(node.left)


if node.right:


queue.append(node.right)



result.append(current_level)



return result


性能分析:

- 时间复杂度:O(n),其中n是树中节点的数量。每个节点只被访问一次。

- 空间复杂度:O(n),在最坏的情况下,队列中可能存储所有节点。

总结

本文介绍了二叉树层序遍历的迭代法实现,并对其进行了优化。迭代法避免了递归法可能导致的栈溢出问题,并且具有较好的性能。在实际应用中,我们可以根据具体情况进行优化,以提高代码的效率和可读性。

扩展阅读

- [LeetCode 102. Binary Tree Level Order Traversal](https://leetcode.com/problems/binary-tree-level-order-traversal/)

- [LeetCode 107. Binary Tree Level Order Traversal II](https://leetcode.com/problems/binary-tree-level-order-traversal-ii/)

- [LeetCode 103. Binary Tree Zigzag Level Order Traversal](https://leetcode.com/problems/binary-tree-zigzag-level-order-traversal/)

通过阅读这些题目,我们可以进一步了解二叉树层序遍历的不同变体和优化技巧。