该问题的广度优先遍历(层次遍历)比较简单,因此只记录深度优先遍历,基本思想是:根节点->右子树->左子树的遍历顺序,可以保证每层中的最右节点总是首先被访问到,因此将其添加到结果集中即可。
    关键问题是如何判断是否是每层的最右节点呢?
    深度depth定义为从0开始,则从根节点(depth=0)开始,当当前节点的深度depth == 结果集res.size()时,表明当前节点所在层还没有一个节点在结果集中,而当前节点又是当前层第一个被访问的节点,因此它一定是当前层的最右节点。
    代码如下:

    1. public class Solution199_version2 {
    2. private List<Integer> res = new LinkedList<>();
    3. public List<Integer> rightSideView(TreeNode root) {
    4. dfs(root, 0);
    5. return res;
    6. }
    7. /**
    8. *
    9. * @param root
    10. * @param depth 深度depth表明当前节点的深度,从0开始计算
    11. */
    12. public void dfs(TreeNode root, int depth){
    13. if(root == null) return;
    14. if(depth == res.size()){//表明当前节点是该层第一个被访问的到的节点
    15. res.add(root.val);
    16. }
    17. depth++;
    18. dfs(root.right, depth);
    19. dfs(root.left, depth);
    20. }
    21. }