题目
给定一个二叉树的 根节点root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
输入: [1,2,3,null,5,null,4] 输出: [1,3,4]
题解
第一种
首先判断根节点是否为 null,如果是,则直接返回空数组,接下来我们定义两个数组 arr 和 ans,其中 arr 用于存放当前层的节点,ans 用于存放右视图节点的值,然后将根节点压入 arr 数组,并将根节点的值压入 ans 数组,接下来进入 while 循环,判断 arr 数组是否为空,如果不为空,则去获取当前层的节点数 currLen,然后去遍历 arr 数组中的 currLen 个节点,依次弹出节点并进行判断当前节点是否有左子节点,有则将其左子节点压入 arr 数组,在判断当前节点是否有右子节点,有则将其右子节点压入 arr 数组,然后判断 arr 数组最后一个节点是否为空,如果不为空,则将其值压入 ans 数组,当循环结束后,将 ans 数组返回出去即可
function rightSideView(root) { if (root == null) { return [] } let arr = [], ans = [] arr.push(root) ans.push(root.val) while (arr.length) { let currLen = arr.length for (let i = 0; i < currLen; i++) { let node = arr.shift() node.left && arr.push(node.left) node.right && arr.push(node.right) } arr[arr.length - 1] != null ? ans.push(arr[arr.length - 1].val) : '' } return ans };
第二种
我们先定义一个空数组res,用于记录右视图节点的值,然后在定义一个名为dfs的函数,用于递归遍历二叉树。该函数接受两个参数:当前节点root和当前节点所在的深度depth,如果当前节点为空,则返回,如果res数组的长度等于当前节点的深度,说明该深度的节点还没有被记录到右视图中,因此将当前节点的值添加到res数组中,接下来增加深度depth的值,然后递归遍历当前节点的右子树和左子树,然后调用dfs函数,以二叉树的根节点和深度0作为参数,然后返回res数组,即为二叉树的右视图节点值的集合
var rightSideView = function (root) { const res = []; const dfs = (root, depth) => { if (root === null) { return; } if (res.length === depth) { res.push(root.val); } depth++; dfs(root.right, depth); dfs(root.left, depth); } dfs(root, 0); return res; };