LeetCode 199

思路一:BFS
我们可以利用二叉树的层次遍历,只保留每一层的最后一个节点即可,这就是广度优先搜索的方法。
var rightSideView = function(root) {if(!root) return [];let res = [];let queue = [root];while(queue.length) {let size = queue.length;res.push(queue[0].val)while(size--) {let cur = queue.shift();if(cur.right) queue.push(cur.right); // 先放右节点if(cur.left) queue.push(cur.left); // 再放左节点}}return res;};
思路二:DFS
按照 [根节点 -> 右节点 -> 左节点] 的顺序访问,就可以保证每次都是最先访问右边的节点。
这里需要注意 depth===res.length 这句代码。
因为我们每层肯定是最先访问最右边的节点的,因此当前为符合条件的节点时,它肯定能放进 res 中。而当到了左节点时,因为我们已经放进去右节点了,depth 与 res.length 必不可能相等了,因此它放不进 res 中。
var rightSideView = function(root) {let res = []dfs(root, 0, res);return res;}function dfs(root, depth, res) {if(!root) return;// 如果当前节点深度还没出现在res中,则说明该节点是当前层次第一个被访问到的节点// 而第一个被访问到的节点,肯定的最右边的节点if(depth === res.length)res.push(root.val);depth++;dfs(root.right, depth, res);dfs(root.left, depth, res);}
