使用语言:Java
使用方法:
1. 队列
2. 递归
队列代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
//使用队列完成
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root.left);
queue.offer(root.right);
while (!queue.isEmpty()) {
//一次取出两个节点,进行比较
TreeNode leftNode = queue.poll();
TreeNode rightNode = queue.poll();
//这里跳过本次循环,直接进行下一次比较,因为队列里还有其他元素
if (leftNode == null && rightNode == null) {
continue;
}
//不对称情况,直接返回false
if (leftNode == null && rightNode != null) {
return false;
}
if (leftNode != null && rightNode == null) {
return false;
}
if (leftNode.val != rightNode.val) {
return false;
}
//注意放入队列中的节点顺序
//比较的是左节点的左节点 => 右节点的右节点
queue.offer(leftNode.left);
queue.offer(rightNode.right);
//比较的是左节点的右节点 => 右节点的左节点
queue.offer(leftNode.right);
queue.offer(rightNode.left);
}
return true;
}
}
递归代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
return compare(root.left,root.right);
}
public boolean compare(TreeNode leftNode,TreeNode rightNode) {
//终止条件
//该if如果条件成立,直接返回true,因为是分别比较外侧节点和内侧节点是否对称
//属于一个终止条件
if (leftNode == null && rightNode == null) {
return true;
}
if (leftNode == null && rightNode != null) {
return false;
}
if (leftNode != null && rightNode == null) {
return false;
}
if (leftNode.val != rightNode.val) {
return false;
}
//每一次递归要执行
boolean compareOutside = compare(leftNode.left,rightNode.right);
boolean compareInside = compare(leftNode.right,rightNode.left);
return compareInside && compareOutside;
}
}