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.
For example:
Given the following binary tree,
1 <--- / \ 2 3 <--- \ \ 5 4 <---
You should return [1, 3, 4]
.
题意:如果处在一个二叉树的右边,从根向下输出能看到的所有节点的集合。
基本思路:记录二叉树每层节点,然后将最右边的节点保存到List中,然后输出。因此考虑使用按层遍历二叉树算法。主要代码如下:
public List<Integer> rightSideView(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
if(root == null) return result;
//定义一个Queue,保存树的每层节点。
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root); //将根节点加入队列
while(!queue.isEmpty()) {
int size = queue.size(); //判断队列的大小,即上层节点个数
for(int i=0; i<size; i++) {
TreeNode tn = queue.poll(); //依次弹出上层节点,并将其子节点加入队列
if(i == 0) //因为队列是先进先出,节点加入过程也是从右向左,所以每层最右节点就是每层第一个元素
result.add(tn.val); //将最右节点加入List结果集中
if(tn.right != null) queue.offer(tn.right); //首先向队列中加入右节点
if(tn.left != null) queue.offer(tn.left); //向队列中加入左节点
}
}
return result;
}
同理可以实现输出从左看到的节点集合。