LeetCode199 二叉树的右视图 & 剑指OfferII 046 二叉树的右侧视图
题目
解题
解题一:广度优先搜索
// javascript
var rightSideView = function(root) {
if (root === null) return [];
const result = [];
const queue = [root];
while (queue.length > 0) {
const len = queue.length;
for (let i = 0; i < len; ++i) {
const node = queue.shift();
// 如果是当前层的最后一个节点,则为从右侧看到的节点值
if (i === len - 1) {
result.push(node.val);
}
// 仅将非空的节点推入队列中,因为空节点相当于不存在,是看不到的
if (node.left !== null) {
queue.push(node.left);
}
if (node.right !== null) {
queue.push(node.right);
}
}
}
return result;
};
解题二:深度优先搜索
// javascript
var rightSideView = function(root) {
const result = [];
const dfs = (root, level) => {
if (root === null) return;
// 如果当前节点所在深度还没有出现在 result 里,将当前节点值加入
// 否则,更新对应的值
if (result.length === level) {
result.push(root.val);
} else {
result[level] = root.val;
}
// 先左后右
dfs(root.left, level + 1);
dfs(root.right, level + 1);
}
// 从根节点开始访问,根节点深度是0
dfs(root, 0);
return result;
};
优化一下:先遍历右子树,再遍历左子树
// javascript
var rightSideView = function(root) {
const result = [];
const dfs = (root, level) => {
if (root === null) return;
// 如果当前节点所在深度还没有出现在 result 里
// 说明在该深度下当前节点是第一个被访问的节点,将当前节点加入
if (result.length === level) {
result.push(root.val);
}
// 先右后左
dfs(root.right, level + 1);
dfs(root.left, level + 1);
}
// 从根节点开始访问,根节点深度是0
dfs(root, 0);
return result;
};