81 lines
2.7 KiB
Java
81 lines
2.7 KiB
Java
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;
|
||
}
|
||
}
|