这个题目其实没啥说的,就是层次遍历,每次都取那一层的最后一个就行。只是编码过程中有一些边界条件需要注意,再有就是这种需要保存上一层状态的题目,一般是需要两个队列的,来轮流保存每层的节点,代码如下:
public List<Integer> rightSideView(TreeNode root) {
List<Integer> result = new ArrayList<>();
if (root == null)
return result;
if (root.left == null && root.right == null) {
result.add(root.val);
return result;
}
Queue<TreeNode> queue1 = new LinkedList<>();
Queue<TreeNode> queue2 = new LinkedList<>();
//先将根节点加入到队列中
queue1.add(root);
while (!queue1.isEmpty() || !queue2.isEmpty()) {
TreeNode finalCur = null; //记录一层最后的节点
while (!queue1.isEmpty()) {
TreeNode curNode = queue1.remove();
if (curNode.left != null)
queue2.add(curNode.left);
if (curNode.right != null)
queue2.add(curNode.right);
finalCur = curNode;
}
//如果finalCur不为空说明queue1保存的那层遍历了,所以要取出那一层最后一个
if (finalCur != null)
result.add(finalCur.val);
//重置,让它在queue2中继续寻找最后一个
finalCur = null;
while (!queue2.isEmpty()) {
TreeNode curNode = queue2.remove();
if (curNode.left != null)
queue1.add(curNode.left);
if (curNode.right != null)
queue1.add(curNode.right);
finalCur = curNode;
}
//不为空说明queue2保存的那层也遍历了,取出那一层最后一个
if (finalCur != null)
result.add(finalCur.val);
}
return result;
}