方法一递归法javascriptfunction isSymmetric(root) { if (!root) return true; function isMirror(left, right) { // 如果两个节点都为空对称 if (!left !right) return true; // 如果其中一个为空不对称 if (!left || !right) return left right; // 检查当前节点值相等且左子树的左节点与右子树的右节点镜像 // 以及左子树的右节点与右子树的左节点镜像 return left.val right.val isMirror(left.left, right.right) isMirror(left.right, right.left); } return isMirror(root.left, root.right); }方法二迭代法使用队列javascriptfunction isSymmetric(root) { if (!root) return true; const queue [root.left, root.right]; while (queue.length) { const left queue.shift(); const right queue.shift(); // 两个节点都为空继续检查下一对 if (!left !right) continue; // 其中一个为空或值不相等不对称 if (!left || !right || left.val ! right.val) return false; // 成对入队左子树的左节点与右子树的右节点 queue.push(left.left); queue.push(right.right); // 左子树的右节点与右子树的左节点 queue.push(left.right); queue.push(right.left); } return true; }方法三迭代法使用栈javascriptfunction isSymmetric(root) { if (!root) return true; const stack [[root.left, root.right]]; while (stack.length) { const [left, right] stack.pop(); if (!left !right) continue; if (!left || !right || left.val ! right.val) return false; // 成对压栈 stack.push([left.left, right.right]); stack.push([left.right, right.left]); } return true; }测试代码javascript// 定义二叉树节点 class TreeNode { constructor(val, left, right) { this.val (val undefined ? 0 : val); this.left (left undefined ? null : left); this.right (right undefined ? null : right); } } // 测试用例 const root1 new TreeNode(1); root1.left new TreeNode(2, new TreeNode(3), new TreeNode(4)); root1.right new TreeNode(2, new TreeNode(4), new TreeNode(3)); const root2 new TreeNode(1); root2.left new TreeNode(2, null, new TreeNode(3)); root2.right new TreeNode(2, null, new TreeNode(3)); console.log(isSymmetric(root1)); // true console.log(isSymmetric(root2)); // false算法分析时间复杂度O(n)n 是节点数每个节点访问一次空间复杂度递归法O(h)h 是树的高度递归调用栈迭代法O(n)最坏情况下队列/栈需要存储 n/2 个节点思路要点对称二叉树的条件根节点相同左子树的左节点与右子树的右节点镜像左子树的右节点与右子树的左节点镜像递归法简洁直观但要注意递归深度迭代法使用队列或栈成对处理节点避免递归深度限制