1. 题目描述

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例:

  1. 输入: [1,2,3,null,5,null,4]
  2. 输出: [1, 3, 4]
  3. 解释:
  4. 1 <---
  5. / \
  6. 2 3 <---
  7. \ \
  8. 5 4 <---

2. 实现思路

对于二叉树的题目,通常会使用深度优先遍历(DFS)或者广度优先遍历(BFS)来遍历。下面就来用这两种方法来解决这个问题。

DFS:

  • 设置一个level,来保存当前遍历的二叉树的层级,初始值为0
  • 由于我们需要返回的是右视图的节点值,所以先遍历右节点的值,将右节点保存在结果数组中
  • 然后遍历左节点
  • 当结果数组的长度和二叉树当前的层级相同时,就将当前的节点值保存
  • 重复上述步骤,直至遍历完二叉树的所有节点

BFS:
使用广度优先遍历来遍历二叉树,这就相当于二叉树的层序遍历,对于每一层的遍历结果,取最后一个即可,这里我们使用队列来处理。

  • 初始化一个队列,将根节点加入到队列中
  • 当队列不为空的时候,就将队列的元素出队,将最后一个元素加入到结果数组中
  • 在元素出队列的时候,将元素的左右子节点分别加入到队列中
  • 重复上面的第二三步,直至队列为空

    3. 代码实现

    DFS: ```javascript /**
    • Definition for a binary tree node.
    • function TreeNode(val) {
    • this.val = val;
    • this.left = this.right = null;
    • } / /*
    • @param {TreeNode} root
    • @return {number[]} */ var rightSideView = function(root) { if(!root) return [] let res = [] dfs(root, 0, res) return res };

function dfs(root, level, res){ if(root){ if(res.length === level){ res.push(root.val) }

  1. dfs(root.right, level+1, res)
  2. dfs(root.left, level+1, res)
  3. }

}

  1. **BFS:**
  2. ```javascript
  3. /**
  4. * Definition for a binary tree node.
  5. * function TreeNode(val) {
  6. * this.val = val;
  7. * this.left = this.right = null;
  8. * }
  9. */
  10. /**
  11. * @param {TreeNode} root
  12. * @return {number[]}
  13. */
  14. var rightSideView = function(root) {
  15. if(!root) return []
  16. let res = []
  17. let queue = [root]
  18. while(queue.length > 0){
  19. let len = queue.length
  20. while(len){
  21. let node = queue.shift()
  22. if(len === 1){
  23. res.push(node.val)
  24. }
  25. if(node.left){
  26. queue.push(node.left)
  27. }
  28. if(node.right){
  29. queue.push(node.right)
  30. }
  31. len--
  32. }
  33. }
  34. return res
  35. };

4. 提交结果

DFS:
199. 二叉树的右视图 - 图1
BFS:
199. 二叉树的右视图 - 图2