使用的是树的广度优先遍历的思想,使用队列,将根节点放入队列中。
当队列的长度大于0时,弹出元素,同时将该元素的左右孩子放入队列中。
树的广度优先遍历过程:
1)1进入队列【1】
2)1弹出,2,3进入队列【2,3】
3)2弹出,5进入队列。【3,5】
4)3弹出,4进入队列。【5,4】
5)5弹出
6)4弹出
这里我们使用变量size来存储一行的元素个数,当size=0时,表示一行的元素已经被弹出,最后一个被弹出的元素就是最右侧的元素。
- java
/**
* 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> result=new ArrayList<>();
Queue<TreeNode> queue=new LinkedList<>();
if(root==null)
return result;
//将根节点加入到队列中
queue.add(root);
while(!queue.isEmpty()){
//当前队列的元素个数,每行的最后一个元素,就是要输出的元素
int size=queue.size();
while(size>0){
//第一个元素被弹出
TreeNode current=queue.poll();
//如果该元素有左孩子,就加入到队列中
if(current.left!=null)
queue.add(current.left);
//如果该元素有右孩子,就加入到队列中
if(current.right!=null)
queue.add(current.right);
size--;
//size==0,说明一行元素都已经弹出,那么最后一个被弹出的current元素,就是最右侧的元素
if(size==0)
result.add(current.val);
}
}
return result;
}
}
- javascript
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @return {number[]}
*/
var rightSideView = function(root) {
var list=new Array();
if(root===null)
return list;
var queue=new Array();
queue.push(root);
while(queue.length>0){
var size=queue.length;
while(size>0){
var current=queue.shift();
if(current.left!=null)
queue.push(current.left);
if(current.right!=null)
queue.push(current.right);
size--;
if(size==0)
list.push(current.val);
}
}
return list;
};