给你一个二叉树的根节点
root, 检查它是否轴对称。
解法1 递归
思路
因为函数签名只有一个节点入口,而题目要求的是二叉树是否镜像,既然镜像那肯定需要比较左子树和右子树。
所以需要一个辅助函数来去解决问题,这个辅助函数接受该节点的左右子树。
如果左右子树都为空则对称,其中有一个为空 另一个不为空则不对称。
接下来比较左右子树的值以及递归检查左右子树。
代码
function isSymmetric(root: TreeNode | null): boolean {
if (!root) {
return true;
}
const check = (left, right) => {
if (!left && !right) return true;
if (!left || !right) return false;
return (
left.val === right.val &&
check(left.left, right.right) &&
check(left.right, right.left)
);
}
return check(root.left, root.right);
};
时空复杂度
时间复杂度:O(n)
空间复杂度:O(h) 主要为递归栈开销
解法2 迭代
思路
利用层序遍历的思路,每次出队两个节点,比较是否相等之后,成对入队。
左子树的左节点和右子树的右节点成对,左子树的右节点和右子树的左节点成对。
代码
function isSymmetric(root: TreeNode | null): boolean {
if (!root) {
return true;
}
let queue = [root.left, root.right];
while (queue.length) {
const t1 = queue.shift()!;
const t2 = queue.shift()!;
if (!t1 && !t2) continue;
if (!t1 || !t2) return false;
if (t1.val !== t2.val) return false;
queue.push(t1.left, t2.right);
queue.push(t1.right, t2.left);
}
return true;
};
时空复杂度
时间复杂度:O(n)
空间复杂度:O(n)