题目来源

代码1(递归)

java
/**
* 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) {
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;
if(left.val != right.val) return false;
// 左左与右右 左右与右左
return isMirror(left.left,right.right) && isMirror(left.right,right.left);
}
}
代码分析
两子树是否对称最小规模子问题就是:
- 左子树 与 右子树是否堆成
(对称:左子树与右子树是否都为空,两值是否都为空, 不对称:只有一值为空)
- 左子树的左子树与 右子树的右子树 是否同时与 左子树的右子树与 右子树的左子树 均为对称
代码2(dfs迭代法)

java
/**
* 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) {
if(root == null) return true;
Stack<TreeNode> stack = new Stack<>();
stack.push(root.right);
stack.push(root.left);
while(!stack.isEmpty()) {
TreeNode node1 = stack.pop(); //左子树根结点
TreeNode node2 = stack.pop(); //右
if(node1==null && node2==null) continue;
if(node1==null || node2==null || node1.val!=node2.val) return false;
// if(node1==null || node2==null) return false;
// if( node1.val!=node2.val) return false;
//将......逆向入栈 : 左左与右右 左右与右左
// 入栈就是为了 看两子树是否对称
stack.push(node2.left);
stack.push(node1.right);
stack.push(node2.right);
stack.push(node1.left);
}
return true;
}
}
代码分析
这里的dfs,是双向深入的dfs。因为需要两子树进行比较。
代码3(bfs迭代法)

java
/**
* 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) {
if(root == null) return true;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root.left);
queue.offer(root.right);
while(!queue.isEmpty()) {
TreeNode node1 = queue.poll();
TreeNode node2 = queue.poll();
if(node1==null && node2==null) continue;
if(node1==null || node2==null || node1.val!=node2.val) return false;
queue.offer(node1.left);
queue.offer(node2.right);
queue.offer(node1.right);
queue.offer(node2.left);
}
return true;
}
}
代码分析
类似dfs,只是逐层处理。