这一题就要学会思维转换了,要看最右侧的节点,那就进行层序遍历,然后返回每一层的最后一个节点就好了。
层序遍历
1
var rightSideView = function (root) {
if (!root) return []
let level = []
let queue = [root]
while (queue.length) {
let size = queue.length
let l = []
for (let i = 0; i < size; ++i) {
let node = queue.shift()
l.push(node.val)
if (node.left) queue.push(node.left)
if (node.right) queue.push(node.right)
}
level.push(l)
}
let res = []
level.forEach(el => {
res.push(el[el.length - 1])
})
return res
};
2优化
上述代码存在一定的冗余,还是需要使用层序遍历,但是没必要把层序遍历的结果存下来
var rightSideView = function(root) {
if (!root) return [];
let res = [];
let queue = [root];
while (queue.length) {
let size = queue.length;
let lastNode = null;
for (let i = 0; i < size; ++i) {
let node = queue.shift();
lastNode = node; // 在每层最后一个节点时更新 lastNode
if (node.left) queue.push(node.left);
if (node.right) queue.push(node.right);
}
res.push(lastNode.val); // 将最后一个节点的值添加到结果数组中
}
return res;
};
3
这种就更直观了,直接把尾部push到结果之中
var rightSideView = function (root) {
if (!root) return []
const queue = [root]
const res = []
while (queue.length) {
let size = queue.length
res.push(queue[size - 1].val)
for (let i = 0; i < size; ++i) {
let node = queue.shift()
if (node.left) queue.push(node.left)
if (node.right) queue.push(node.right)
}
}
return res
};
错误解法
这里我想着直接沿着最右侧的路径走就好了,但是忽略了一种情况
对于这里的左子树上的节点,就没发遍历了
var rightSideView = function (root) {
if(!root) return []
let res = [root.val];
let current = root;
while (current) {
if (current.right) {
res.push(current.right.val);
current = current.right
} else if (current.left) {
res.push(current.left.val);
current = current.left
} else {
return res;
}
}
};