Algorithm/src/main/java/tree/IsSymmetric.java

81 lines
2.7 KiB
Java
Raw Normal View History

2025-03-18 12:34:17 +08:00
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;
}
}