一、Description
Given a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom.
题目大意:给定一个二叉树,返回一个list,里面存放的是从右边的视角看这棵树得到的结点。
Example:
Input: [1,2,3,null,5,null,4] Output: [1, 3, 4] Explanation: 1 <--- / \ 2 3 <--- \ \ 5 4 <---
二、Analyzation
这个题的思路是通过层次遍历,将每层放入队列的最后一个结点加入到list中。其中层次遍历的时候,按照先右结点后左结点的顺序加入队列,添加一个标记flag,如果按照从右向左的顺序,一旦加入了一个结点,那么该结点一定是该层最右的结点,这时将flag置为true,否则只要flag为false,就会继续判断,直到添加成功。
三、Accepted code
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> list = new ArrayList<>();
if (root == null) {
return list;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
list.add(root.val);
while (!queue.isEmpty()) {
int size = queue.size();
boolean flag = false; //标记每层是否有元素加入到List中
while (size > 0) {
TreeNode node = queue.poll();
if (node.right != null) {
queue.add(node.right);
if (!flag) {
list.add(node.right.val);
flag = true;
}
}
if (node.left != null) {
queue.add(node.left);
if (!flag) {
list.add(node.left.val);
flag = true;
}
}
size--;
}
}
return list;
}
}