Algorithm/src/main/java/tree/IsSymmetric.java
2025-03-18 12:34:17 +08:00

81 lines
2.7 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package tree;
import java.util.LinkedList;
import java.util.Queue;
/**
* 题目: 101. 对称二叉树 (invertTree)
* 描述:给你一个二叉树的根节点 root 检查它是否轴对称。
* 链接https://leetcode.cn/problems/symmetric-tree/
*/
//不会做,递归和迭代都写一下
public class IsSymmetric {
public boolean isSymmetric(TreeNode root) {
// 如果根节点为空,则认为是对称的
if (root == null) {
return true;
}
// 调用辅助函数,判断左子树与右子树是否互为镜像
return isMirror(root.left, root.right);
}
// 辅助函数:判断两个子树是否互为镜像
private boolean isMirror(TreeNode left, TreeNode right) {
// 如果两个节点都为空,则互为镜像
if (left == null && right == null) {
return true;
}
// 如果只有一个为空,则不对称
if (left == null || right == null) {
return false;
}
// 判断两个节点的值是否相等,并递归判断:
// 1. 左子树的左子树和右子树的右子树是否镜像
// 2. 左子树的右子树和右子树的左子树是否镜像
return (left.val == right.val)
&& isMirror(left.left, right.right)
&& isMirror(left.right, right.left);
}
public boolean isSymmetric1(TreeNode root) {
if (root == null) {
return true;
}
// 使用队列来存储成对的节点进行比较
Queue<TreeNode> queue = new LinkedList<>();
// 将根节点的左右子节点放入队列
queue.offer(root.left);
queue.offer(root.right);
while (!queue.isEmpty()) {
// 每次从队列中取出两个节点进行比较
TreeNode left = queue.poll();
TreeNode right = queue.poll();
// 如果两个节点均为空,说明这一对对称,继续下一对
if (left == null && right == null) {
continue;
}
// 如果只有一个为空,或者两个节点的值不相等,则不是对称树
if (left == null || right == null || left.val != right.val) {
return false;
}
// 将左右节点的子节点按照对称顺序加入队列:
// 1. 左子节点的左子树和右子节点的右子树
// 2. 左子节点的右子树和右子节点的左子树
queue.offer(left.left);
queue.offer(right.right);
queue.offer(left.right);
queue.offer(right.left);
}
// 遍历完所有节点对后,没有发现不对称的情况
return true;
}
}