数据结构与算法之 leetcode 二叉树右子节点遍历 递归法实现

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


二叉树右子节点遍历(递归法实现)——LeetCode算法挑战

二叉树是计算机科学中常见的一种数据结构,它由节点组成,每个节点最多有两个子节点:左子节点和右子节点。在二叉树中,遍历是一种基本操作,它可以帮助我们访问树中的所有节点。在LeetCode等编程竞赛平台中,二叉树的遍历问题经常出现。本文将围绕“二叉树右子节点遍历”这一主题,使用递归法实现,并探讨其背后的数据结构与算法原理。

1. 问题分析

“二叉树右子节点遍历”要求我们按照从上到下、从左到右的顺序遍历二叉树的每个节点,并且每个节点只访问其右子节点。这意味着我们需要在遍历过程中忽略左子节点,只关注右子节点。

2. 递归法实现

递归是一种常用的算法设计方法,它通过将问题分解为更小的子问题来解决原问题。在二叉树右子节点遍历中,我们可以使用递归法来实现。

2.1 递归法的基本思路

递归法的基本思路是:从根节点开始,先访问其右子节点,然后递归地访问右子节点的右子节点,直到右子节点为空。在这个过程中,我们记录下访问过的节点。

2.2 递归法实现代码

以下是一个使用递归法实现二叉树右子节点遍历的Python代码示例:

python

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 = []


def dfs(node, level):


if not node:


return


if len(result) < level:


result.append(node.val)


dfs(node.right, level + 1)


dfs(node.left, level + 1)



dfs(root, 0)


return result

测试代码


if __name__ == "__main__":


构建测试用例


root = TreeNode(1)


root.left = TreeNode(2)


root.right = TreeNode(3)


root.left.left = TreeNode(4)


root.left.right = TreeNode(5)


root.right.right = TreeNode(6)



执行遍历


result = rightSideView(root)


print(result) 输出应为 [1, 3, 6]


2.3 代码解析

- `TreeNode` 类定义了二叉树的节点结构,包含值 `val`、左子节点 `left` 和右子节点 `right`。

- `rightSideView` 函数是主函数,它接收一个二叉树的根节点 `root`,并返回一个包含右子节点遍历结果的列表。

- `dfs` 函数是递归辅助函数,它接收当前节点 `node` 和当前节点所在的层级 `level`。在递归过程中,我们首先检查当前节点是否为空,如果不为空,则检查当前层级是否为结果列表的长度,如果是,则将当前节点的值添加到结果列表中。然后,递归地调用 `dfs` 函数访问当前节点的右子节点和左子节点。

3. 时间复杂度和空间复杂度分析

3.1 时间复杂度

在递归法中,每个节点只被访问一次,因此时间复杂度为 O(n),其中 n 是二叉树中节点的数量。

3.2 空间复杂度

递归法中,递归栈的深度取决于二叉树的高度。在最坏的情况下,二叉树可能退化成一个链表,此时递归栈的深度为 n。空间复杂度为 O(n)。

4. 总结

本文介绍了二叉树右子节点遍历的递归法实现,并分析了其时间复杂度和空间复杂度。递归法是一种简单且直观的算法设计方法,适用于解决许多二叉树问题。在实际应用中,我们可以根据具体问题选择合适的遍历方法,以达到最优的性能。