题目描述
给定一个二叉树的 根节点
root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例 1:
输入: [1,2,3,null,5,null,4] 输出: [1,3,4]示例 2:输入: [1,null,3] 输出: [1,3]
示例 3:输入: [] 输出: []
提示:
- 二叉树的节点个数的范围是
[0,100]
-100 <= Node.val <= 100
解题思路
要从二叉树的右侧查看并返回节点值,我们可以使用层序遍历(广度优先遍历)来实现。具体来说,我们需要从右侧依次访问每一层的节点,并从每一层的最右侧节点开始返回结果。
-
层序遍历:
使用一个队列来实现层序遍历;遍历每一层的节点时,记录每层的最后一个节点值,因为它代表了从右侧可以看到的节点;将每一层的节点值添加到结果列表中。 -
实现步骤:
- 初始化一个队列,将根节点加入队列。
- 对于每一层,记录层的节点数(即队列的当前大小)。
- 遍历该层的所有节点,并更新队列(将当前节点的左子节点和右子节点加入队列)。
- 记录每层最后一个节点的值(即右侧可见节点)。
- 返回结果列表。
复杂度分析
- 时间复杂度:
O(n)
,其中n
是树中的节点数。每个节点被访问一次。 - 空间复杂度:
O(w)
,其中w
是树的最大宽度(即队列中最大的元素数)。在最坏的情况下,队列的大小等于树的最大宽度。
代码实现
package org.zyf.javabasic.letcode.hot100.tree;
import org.zyf.javabasic.letcode.tree.base.TreeNode;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
/**
* @program: zyfboot-javabasic
* @description: 二叉树的右视图(中等)
* @author: zhangyanfeng
* @create: 2024-08-22 11:53
**/
public class RightSideViewSolution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int levelSize = queue.size();
Integer rightMostValue = null;
for (int i = 0; i < levelSize; i++) {
TreeNode node = queue.poll();
rightMostValue = node.val;
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
result.add(rightMostValue);
}
return result;
}
public static void main(String[] args) {
RightSideViewSolution solution = new RightSideViewSolution();
// Example 1
TreeNode root1 = new TreeNode(1);
root1.left = new TreeNode(2);
root1.right = new TreeNode(3);
root1.left.right = new TreeNode(5);
root1.right.right = new TreeNode(4);
System.out.println(solution.rightSideView(root1)); // Output: [1, 3, 4]
// Example 2
TreeNode root2 = new TreeNode(1);
root2.right = new TreeNode(3);
System.out.println(solution.rightSideView(root2)); // Output: [1, 3]
// Example 3
TreeNode root3 = null;
System.out.println(solution.rightSideView(root3)); // Output: []
}
}