📅  最后修改于: 2023-12-03 15:39:41.020000             🧑  作者: Mango
本题要求打印一棵二叉树的所有回文层。所谓“回文层”,是指在一棵二叉树中,从上到下、从左到右,第一层与最后一层对称,第二层与倒数第二层对称,依此类推。
我们可以先把二叉树的所有结点按照层序遍历的顺序存储在一个列表里。然后,对于每层,我们用两个指针分别从该层的最左边和最右边往中间逼近,检查它们所指的两个结点是否相同。如果相同,我们就把它们的值打印出来。接下来移动指针,检查下一组结点是否是回文的。如果一直循环到了中间,我们就找到了该层的所有回文结点。
function palindrome_layers(root) {
let queue = [[root, 0]],
nodes = [];
while (queue.length > 0) {
let [curr, depth] = queue.shift();
if (curr === null) continue;
if (!nodes[depth]) nodes[depth] = [];
nodes[depth].push(curr.value);
queue.push([curr.left, depth + 1]);
queue.push([curr.right, depth + 1]);
}
for (let i = 0; i < nodes.length; i++) {
let left = 0,
right = nodes[i].length - 1;
while (left < right) {
if (nodes[i][left] === nodes[i][right]) {
console.log(nodes[i][left]);
}
left++;
right--;
}
}
}
时间复杂度:$O(n)$,其中 $n$ 是二叉树的结点数。需要遍历所有结点,并且每个结点都只被遍历一次。
空间复杂度:$O(n)$,需要用一个队列存储每个结点,以及一个列表存储每层的回文结点。