一、题目
题目分析:
侧面观察二叉树,将观察到的节点从上到下依次输出-->也就是层次遍历二叉树,输出每一层的最后一个节点
二、
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> nodes =new ArrayList<Integer>();
if(root==null){
return nodes;
}
bfs(root, nodes)//广度搜索
return nodes;
}
public void bfs(TreeNode root, List<Integer> nodes){
Queue<TreeNode> currentLevel= new LinkedList<TreeNode>();
currentLevel.add(root);
while(!currentLevel.isEmpty()){//当前层不为空
int size=currentLevel.size();//当前层结点个数+上一层遗留的最后一个节点
for(int i=0;i<size-1;i++){//遍历size-1次,留下上一层最后一个节点
TreeNode currentNode=currentLevel.poll();
if(currentNode.left!=null)//后续节点继续加入
currentLevel.add(currentNode.left);
if(currentNode.right!=null)
currentLevel.add(currentNode.right);
}
TreeNode lastnode=currentLevel.poll();//这个就是上一层的最后一个节点
nodes.add(lastnode.val);
if(lastnode.left!=null)
currentLevel.add(lastnode.left);
if(lastnode.right!=null)
currentLevel.add(lastnode.right);
}
}
}
分析:
其实最容易想到的是,保存每一层的节点,然后输出最后一个节点就可以了
关于什么时候用arraylist 什么时候用linkedlist,前者是基于数组的数据结构,后者是基于链表的数据结构。前者查询较快,后者增删改较快。
Queue<TreeNode> currentLevel= new LinkedList<TreeNode>();
队列是先进先出,所以poll的是头的位置
要么记录每层有几个节点,定义一个num值,然后弹一个节点,记录后续左右孩子,直到num值定位到最右节点加入到nodes里面
本题采用的是,每一次都将每层的最右节点留下来,然后下一层的节点依次加入到queue里面,然后弹出queue的头,也就是上一层的最右节点,这种做法比较机智哦,但感觉还是记录num个数更好想