一、題目
題目分析:
側面觀察二叉樹,將觀察到的節點從上到下依次輸出-->也就是層次遍歷二叉樹,輸出每一層的最後一個節點
二、
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個數更好想