LeetCode热题100--199. 二叉树的右视图--中等
1. 题目
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例 1:
输入:root = [1,2,3,null,5,null,4]
输出:[1,3,4]
解释:
示例 2:
输入:root = [1,2,3,4,null,null,null,5]
输出:[1,3,4,5]
解释:
示例 3:
输入:root = [1,null,3]
输出:[1,3]
示例 4:
输入:root = []
输出:[]
2. 题解
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public List<Integer> rightSideView(TreeNode root) {List<Integer> ans = new ArrayList<>();dfs(root, 0, ans);return ans;}private void dfs(TreeNode root, int depth, List<Integer> ans) {if (root == null) {return;}if (depth == ans.size()) { // 这个深度首次遇到ans.add(root.val);}dfs(root.right, depth + 1, ans); // 先递归右子树,保证首次遇到的一定是最右边的节点dfs(root.left, depth + 1, ans);}
}
3. 解析
出自:【视频】如何灵活运用递归?(Python/Java/C++/Go/JS/Rust)
1-4行:这是对TreeNode类的定义或者说结构体的定义,它是一棵二叉树,其中每个节点最多有两个子节点,一个左子节点和一个右子节点。如果没有提供值、左子节点或右子节点,它们将默认为null。
7-13行:这些代码定义了一个名为Solution的类,其中包含了一些与二叉树相关的方法。这段代码的主要功能是找到二叉树的右视图。
16-20行:rightSideView(TreeNode root)是一个方法,它创建一个新的列表来保存结果。然后调用dfs函数开始深度优先搜索并返回结果。
24-30行:dfs(TreeNode root, int depth, List ans)是一个私有的方法,用于执行深度优先搜索。它接受一个根节点、深度和答案列表作为参数。如果当前节点为null,则返回;否则,先递归右子树,然后再递归左子树。这样可以保证在每一层中,最右边的节点会被首先访问到。
在这段代码中,我们使用了深度优先搜索(DFS)的方法来遍历二叉树。我们在每一层的最后遇到的节点就是二叉树的右视图。