LeetCode:对称二叉树
1、题目描述
给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
提示:
-
树中节点数目在范围
[1, 1000]
内 -
-100 <= Node.val <= 100
进阶:你可以运用递归和迭代两种方法解决这个问题吗?
2、方法1:递归法
解题思路
递归法通过比较左右子树的对称性来判断整棵树是否对称。
步骤:
-
终止条件:
-
左右节点均为
null
,返回true
。 -
左右节点有一个为
null
,返回false
。 -
左右节点值不相等,返回
false
。
-
-
递归比较:
-
比较左子树的左节点与右子树的右节点。
-
比较左子树的右节点与右子树的左节点。
-
-
返回结果:上述两个比较结果必须同时为
true
。
时间复杂度:O(n),空间复杂度:O(n) (调用栈)
public boolean isSymmetric(TreeNode root) {if (root == null) return true;return isMirror(root.left, root.right);
}private boolean isMirror(TreeNode l, TreeNode r) {if (l == null && r == null) return true; // 均为空if (l == null || r == null) return false; // 一个为空if (l.val != r.val) return false; // 值不相等return isMirror(l.left, r.right) && isMirror(l.right, r.left); // 递归比较
}
3、方法2:迭代法
解题思路
迭代法通过队列按层比较左右子树的对称性。
步骤:
-
初始化:将根节点的左右子节点入队。
-
循环处理队列:
-
每次取出两个节点(左子树的节点和右子树的节点)。
-
检查是否均为
null
,是则跳过。 -
检查是否一个为
null
或值不相等,是则返回false
。 -
将左子树的左节点与右子树的右节点入队(比较外侧)。
-
将左子树的右节点与右子树的左节点入队(比较内侧)。
-
-
返回结果:队列为空时未发现不对称,返回
true
。
时间复杂度:O(n),空间复杂度:O(n) (栈空间)
public boolean isSymmetric(TreeNode root) {Queue<TreeNode> queue = new LinkedList<>();queue.offer(root.left);queue.offer(root.right);while (!queue.isEmpty()) {TreeNode u = queue.poll();TreeNode v = queue.poll();if (u == null && v == null) continue; // 均为空if (u == null || v == null) return false; // 一个为空if (u.val != v.val) return false; // 值不相等queue.offer(u.left); // 左子树的左节点queue.offer(v.right); // 右子树的右节点queue.offer(u.right); // 左子树的右节点queue.offer(v.left); // 右子树的左节点}return true;
}