1. 题目描述
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释:1 <---/ \2 3 <---\ \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) }
dfs(root.right, level+1, res)dfs(root.left, level+1, res)}
}
**BFS:**```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 = []let queue = [root]while(queue.length > 0){let len = queue.lengthwhile(len){let node = queue.shift()if(len === 1){res.push(node.val)}if(node.left){queue.push(node.left)}if(node.right){queue.push(node.right)}len--}}return res};
4. 提交结果
DFS:
BFS:
