该问题的广度优先遍历(层次遍历)比较简单,因此只记录深度优先遍历,基本思想是:根节点->右子树->左子树的遍历顺序,可以保证每层中的最右节点总是首先被访问到,因此将其添加到结果集中即可。
关键问题是如何判断是否是每层的最右节点呢?
深度depth定义为从0开始,则从根节点(depth=0)开始,当当前节点的深度depth == 结果集res.size()时,表明当前节点所在层还没有一个节点在结果集中,而当前节点又是当前层第一个被访问的节点,因此它一定是当前层的最右节点。
代码如下:
public class Solution199_version2 {private List<Integer> res = new LinkedList<>();public List<Integer> rightSideView(TreeNode root) {dfs(root, 0);return res;}/**** @param root* @param depth 深度depth表明当前节点的深度,从0开始计算*/public void dfs(TreeNode root, int depth){if(root == null) return;if(depth == res.size()){//表明当前节点是该层第一个被访问的到的节点res.add(root.val);}depth++;dfs(root.right, depth);dfs(root.left, depth);}}
