数据结构与算法之 leetcode 二叉树右子节点 层次遍历右视图

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


二叉树右子节点(层次遍历右视图)在LeetCode中的实现与优化

二叉树是计算机科学中常见的一种数据结构,它由节点组成,每个节点包含一个数据值和两个指针,分别指向其左子节点和右子节点。在二叉树的处理中,层次遍历是一种常用的方法,它按照从上到下、从左到右的顺序访问树中的所有节点。在LeetCode等编程竞赛平台中,二叉树的层次遍历问题经常出现,其中“二叉树右子节点”或“层次遍历右视图”是一个典型的题目。

本文将围绕“二叉树右子节点”这一主题,探讨其在LeetCode中的实现方法,并分析不同实现方案的优缺点,最后提出一种优化方案,以提高算法的效率。

基础实现

题目描述

给定一个二叉树,返回其每一层的最右边的节点值。

示例


输入:[1,2,3,4,5,6,7]


输出:[1,3,7]


基础代码实现

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 rightSideView(root):


if not root:


return []



result = []


queue = deque([root])



while queue:


level_size = len(queue)


for i in range(level_size):


node = queue.popleft()


if i == level_size - 1:


result.append(node.val)


if node.left:


queue.append(node.left)


if node.right:


queue.append(node.right)



return result


分析

上述代码使用队列实现层次遍历,每次从队列中取出一个节点,并将其右子节点和左子节点(如果存在)加入队列。当遍历到每一层的最后一个节点时,将其值添加到结果列表中。这种方法的时间复杂度为O(n),空间复杂度为O(n),其中n为二叉树中节点的数量。

优化方案

问题分析

在基础实现中,我们每次都将所有节点加入队列,然后逐个取出。这种方法虽然简单,但存在一些可以优化的空间。

1. 减少不必要的节点访问:在遍历过程中,我们可以只将右子节点加入队列,从而减少队列的大小,提高效率。

2. 减少队列操作:在遍历过程中,我们可以直接在队列中找到每一层的最后一个节点,而不是遍历整个队列。

优化代码实现

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 rightSideView(root):


if not root:


return []



result = []


queue = deque([(root, 0)]) 使用元组存储节点和层级



while queue:


node, level = queue.popleft()


if level == len(result):


result.append(node.val)


if node.right:


queue.append((node.right, level + 1))


if node.left:


queue.append((node.left, level + 1))



return result


分析

优化后的代码使用了一个元组来存储节点和层级信息。在遍历过程中,我们只将右子节点加入队列,并且直接在队列中找到每一层的最后一个节点。这种方法的时间复杂度仍为O(n),但空间复杂度降低到了O(log n),因为队列中最多只存储当前层的节点。

总结

本文探讨了二叉树右子节点(层次遍历右视图)在LeetCode中的实现与优化。通过分析基础实现和优化方案,我们了解到优化后的代码在保持时间复杂度不变的情况下,降低了空间复杂度。在实际应用中,我们可以根据具体需求选择合适的实现方案。

在解决LeetCode等编程竞赛平台中的问题时,理解数据结构与算法的原理至关重要。通过不断练习和优化,我们可以提高自己的编程能力,为未来的职业发展打下坚实的基础。