这里是比较的镜像,所以进一步简化成了
left.left 和 right.right 比较
left.right 和 right.left 比较
这里看bfs的思路,我感觉更容易理解一些
递归
-
对称的条件是:根节点的左子树和右子树相互镜像。
-
对于两个树 A 和 B,它们是镜像对称的当且仅当:
- 它们的根节点值相同。
- A 的左子树与 B 的右子树镜像对称。
- A 的右子树与 B 的左子树镜像对称。
var isSymmetric = function(root) {
if (!root) return true;
function isMirror(left, right) {
if (!left && !right) return true;
if (!left || !right) return false;
return (
left.val === right.val &&
isMirror(left.left, right.right) &&
isMirror(left.right, right.left)
);
}
return isMirror(root.left, root.right);
};
var isSymmetric = function (root) {
if (!root) return true
return helper(root.left, root.right)
};
var helper = function (left, right) {
if (!left && !right) {
return true
} else if ((!left && right) || (left && !right)) {
return false
} else {
return helper(left.left, right.right) && (left.right, right.left)
}
}
迭代法
- 使用队列来实现树的层次遍历,同时检查每一层的节点是否是对称的。
推入队列的顺序要注意,两两成对的push进入,关注小问题,也就是
left.left和right.right比较
left.right和right.left比较
后面的自然形成规律
var isSymmetric = function (root) {
let queue = []
queue.push(root.left, root.right)
while (queue.length) {
let left = queue.shift()
let right = queue.shift()
if (!left && !right) continue
if (!left || !right || left.val !== right.val) return false
queue.push(left.left, right.right)
queue.push(left.right, right.left)
}
return true
};