先看题目描述:
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
1 <---
/ \
2 3 <---
\ \
5 4 <---
想法:刚看到题目时,有点懵,后来看了示例,才反应过来,这不就是要将二叉树每一层的最后一个元素返回么,联想到了二叉树中的层次遍历,因此只要把每一层的最后一个元素标记出来就解决了。
层次遍历是需要借助队列来实现的,利用队列的“先进先出”特性,可以很方便的实现层次遍历。
那接下来直接贴出我的代码吧,在LeetCode上显示3ms,内存占用比较大:35.1MB,算是空间换时间吧。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> list = new ArrayList<>();
//如果为一棵空树,返回空的list
if(root == null)
return list;
//层次遍历借助的队列
ArrayDeque<TreeNode> queue = new ArrayDeque<>();
queue.add(root);
//curLayer是当前层所还未访问的节点数
//nextLayer是下一层未访问的节点数,(用来统计出下一层总共有一个节点)
int curLayer = 1, nextLayer = 0;
while(!queue.isEmpty()){
TreeNode node = queue.pop();
curLayer--;
if(node.left != null){
queue.add(node.left);
nextLayer++;
}
if(node.right != null){
queue.add(node.right);
nextLayer++;
}
//如果当前层的节点都遍历完了,则下一层的节点数也统计出来了
if(curLayer == 0){
list.add(node.val);
curLayer = nextLayer;
nextLayer = 0;
}
}
return list;
}
}
好啦,以上就是我的想法与代码。
上面代码不是最优的,如果你们有更优秀的想法,欢迎指导!