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 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; } }