题目描述:
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
1 <---
/ \
2 3 <---
\ \
5 4 <---
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-right-side-view
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法:
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) {
return list;
}
Queue<TreeNode> que = new LinkedList<>();
que.add(root);
while (!que.isEmpty()) {
Queue<TreeNode> next = new LinkedList<>();
int last = 0;
while (!que.isEmpty()) {
TreeNode cur = que.poll();
last = cur.val;
if (cur.left != null) {
next.add(cur.left);
}
if (cur.right != null) {
next.add(cur.right);
}
}
list.add(last);
que.addAll(next);
}
return list;
}
}
思路概述:
层次遍历,list记录每一层最后一个结点的值。
用一个next队列,记录当前结点的下一层(即左右孩子),这样不影响当前队列,每次弹出一个结点,都更新last值,则最后一个弹出的一定是当前结点最右边的。当que为空时,此时next队列已经记录了下一层的所有节点。再将所有next的结点添加到que即可
当然也可以不用额外的next队列
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) {
return list;
}
Queue<TreeNode> que = new LinkedList<>();
que.add(root);
while (!que.isEmpty()) {
int last = 0;
int size = que.size();
while (size-- > 0) {
TreeNode cur = que.poll();
last = cur.val;
if (cur.left != null) {
que.add(cur.left);
}
if (cur.right != null) {
que.add(cur.right);
}
}
list.add(last);
}
return list;
}
}