一、判断对称 = 判断镜像
对称二叉树不是比较每个节点的左右子节点。而是比较左子树的左子节点和右子树的右子节点 ,以及左子树的右子节点和右子树的左子节点。
也就是交叉对比。
二、递归解法
javascript
var isSymmetric = function(root) {
if (!root) return true;
return check(root.left, root.right);
};
function check(p, q) {
if (!p && !q) return true;
if (!p || !q) return false;
if (p.val !== q.val) return false;
return check(p.left, q.right) && check(p.right, q.left);
}
check(p.left, q.right) 和 check(p.right, q.left)------这就是交叉对比。
三、迭代解法
javascript
var isSymmetric = function(root) {
if (!root) return true;
const queue = [root.left, root.right];
while (queue.length) {
const p = queue.shift();
const q = queue.shift();
if (!p && !q) continue;
if (!p || !q) return false;
if (p.val !== q.val) return false;
queue.push(p.left, q.right);
queue.push(p.right, q.left);
}
return true;
};
入队顺序也是交叉的:p.left, q.right 和 p.right, q.left。
四、复杂度
时间 O(n),空间 O(n)。
五、总结
- 对称 = 左子树和右子树互为镜像
- 交叉对比:左左 ↔ 右右,左右 ↔ 右左
- 递归代码最简洁,迭代用队列模拟
- 掌握对称二叉树 = 掌握翻转二叉树 + 判断两棵树相等