思考:只需要知道每一行的最后一个节点值即可。
方法
- 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);
}
}