https://leetcode.com/problems/find-largest-value-in-each-tree-row/description/
You need to find the largest value in each row of a binary tree.
Example:
Input:
1
/ \
3 2
/ \ \
5 3 9
Output: [1, 3, 9]
按深度遍历树,最直观的就是bfs,利用队列来一层一层的进行遍历了。
var largestValues = function(root) {
const rowArr = [];
if (!root) {
return rowArr;
}
const queue = [root];
while (queue.length > 0) {
const len = queue.length;
let max = queue[0].val; // queue is not empty then there must be at least one element here
for (let i = 0; i < len; ++i) {
const current = queue.shift();
max = current.val > max ? current.val : max;
if (current.left) {
queue.push(current.left);
}
if (current.right) {
queue.push(current.right);
}
}
rowArr.push(max);
}
return rowArr;
};
除了bfs,我们也可以利用递归dfs来遍历,只要传入一个当前层数作为标记,并传入一个每层的结果数组。将每层的结果保存在rowArr
中,最后在对每层结果进行处理,返回每层的最大值。
var largestValues = function(root) {
const rowArr = [];
getRows(root, 0, rowArr);
return rowArr.map((arr)=>{
return arr.reduce((pre, next) => {
return pre > next ? pre : next;
}, arr[0]);
});
};
const getRows = (root, rowNum, rowArr) => {
if (root) {
if (rowNum >= rowArr.length) {
rowArr.push([]);
}
rowArr[rowNum].push(root.val);
getRows(root.left, rowNum+1, rowArr);
getRows(root.right, rowNum+1, rowArr);
}
};
这样就beat 70%了,要是在递归中直接把最大值处理返回了会怎样呢?
var largestValues = function(root) {
const rowArr = [];
getRows(root, 0, rowArr);
// return rowArr.map((arr)=>{
// return arr.reduce((pre, next) => {
// return pre > next ? pre : next;
// }, arr[0]);
// });
return rowArr;
};
const getRows = (root, rowNum, rowArr) => {
if (root) {
if (rowNum >= rowArr.length) {
rowArr.push(root.val);
} else {
rowArr[rowNum] = rowArr[rowNum] > root.val ? rowArr[rowNum] : root.val;
}
getRows(root.left, rowNum+1, rowArr);
getRows(root.right, rowNum+1, rowArr);
}
};
结果是beat 40%,估计是由于javascript数组的查询修改比直接后面push一个要更加耗时吧。