「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战」
给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
输入: [1,2,3,null,5,null,4]
输出: [1,3,4]
示例 2:
输入: [1,null,3]
输出: [1,3]
示例 3:
输入: []
输出: []
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/WN…
思路
- 首先根据题意,我们第一个想到的思路就是
-
进行层序遍历,因为层序遍历可以进行每层的遍历
-
那么我们去想,如果使用一个队列保存当前遍历的
cur,另一个队列保存下一层的节点 -
主要利用队列的先入先出的特点
-
- 来看下面代码,每次
cur代表的是当前遍历到的节点-
q1队列一直出队列,当为空的时候,也就是以为着这一层遍历完了 -
那么我们最后保存的那个节点(也可以理解为
q1最后出队的节点),就是这一层的最后一个节点了 -
所以
res进行添加q1队列最后出队列的那一个节点 -
最后将
q2队列赋值给q1,重新创建q2对象
-
/**
* 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> res = new LinkedList<>();
if (root == null) {
return res;
}
Queue<TreeNode> q1 = new LinkedList<>();
Queue<TreeNode> q2 = new LinkedList<>();
q1.offer(root);
while (!q1.isEmpty()) {
TreeNode cur = q1.poll();
if (cur.left != null) {
q2.offer(cur.left);
}
if (cur.right != null) {
q2.offer(cur.right);
}
if (q1.isEmpty()) {
res.add(cur.val);
q1 = q2;
q2 = new LinkedList<>();
}
}
return res;
}
}
此题完美的借用了层序遍历及队列的应用,当然也有其他解法,可以先走二叉树的最右边