题目
给定一个二叉树的 根节点
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;
};
坚持努力,无惧未来!