思考:只需要知道每一行的最後一個節點值即可。
方法
- 1、考慮使用兩個隊列進行BFS,A隊列存放當前行的節點,B隊列存放當前節點的子節點,即當A隊列空時,最後一個訪問的節點即位當前行的最後一個節點。
- 2、遞歸遍歷。每一層都會有一個值加入列表,即可以利用DFS來遍歷,並傳入當前深度level(root爲1),如果當前深度等於re(結果列表)的長度,即將re的第level個值更新爲當前節點的值(每一行的最後一個節點會覆蓋其之前的所有節點,這樣re中存的就是最右邊的值)。如果level大於re的長度,則添加當前節點值爲re的第level個值(level只會比re長度大一,所以直接add就可以)。
代碼塊
利用雙隊列
public class Solution {
public List<Integer> rightSideView(TreeNode root) {
Queue<TreeNode> q1 = new LinkedList<TreeNode>();
List<Integer> re = new LinkedList<Integer>();
if(root == null)
return re;
q1.add(root);
while(!q1.isEmpty()){
Queue<TreeNode> q2 = new LinkedList<TreeNode>();
TreeNode temp = null;
while(!q1.isEmpty()){
temp = q1.poll();
if(temp.left != null)
q2.add(temp.left);
if(temp.right != null)
q2.add(temp.right);
}
re.add(temp.val);
q1.addAll(q2);
}
return re;
}
}
利用遞歸
public class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> re = new LinkedList<Integer>();
DFSRightView(root, 1, re);
return re;
}
void DFSRightView(TreeNode node, int level, List<Integer>re){
if(node == null)
return;
if(level > re.size()) re.add(node.val);
else re.set(level - 1, node.val);
DFSRightView(node.left, level + 1, re);
DFSRightView(node.right, level + 1, re);
}
}