题目给出的初始条件
/**
* 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 dfs(root,root);
}
boolean dfs(TreeNode left,TreeNode right){
//如果左子树和右子树都为空直接返回true
if(left==null&&right==null){
return true;
}
//程序执行到这说明左右子树不都为空,如果有一个为空直接返回false
if(left==null||right==null){
return false;
}
//比较左子树和右子树的值,如果不相等就返回false
if(left.val!=right.val){
return false;
}
//使用递归,比较左子树的左孩子和右子树的右孩子,左子树的右孩子和右子树的左孩子
return dfs(left.left,right.right)&&dfs(left.right,right.left);
}
}
定义dfs方法实现递归,如果左子树的值和右子树的值相等就 比较左子树的左孩子和右子树的右孩子,左子树的右孩子和右子树的左孩子
二,队列
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null||root.left==null&&root.right==null){
return true;
}
//创建一个队列把根节点的左孩子和右孩子放入队列
LinkedList<TreeNode> queue=new LinkedList<TreeNode>();
queue.add(root.left);
queue.add(root.right);
//当队列不为空就取出左孩子和右孩子比较
while(queue.size()>0){
TreeNode left=queue.removeFirst();
TreeNode right=queue.removeFirst();
//如果都为空就进入下一次循环
if(left==null&&right==null){
continue;
}
//有一个为空返回false
if(left==null||right==null){
return false;
}
//左孩子和右孩子值不相等返回false
if(right.val!=left.val){
return false;
}
//把左子树的左孩子和右子树的右孩子放入队列
queue.add(left.left);
queue.add(right.right);
//把左子树的右孩子和右子树的左孩子放入队列
queue.add(left.right);
queue.add(right.left);
}
return true;
}
}
把左右孩子放入队列,然后拿出来比较(队列:按什么顺序放进去就按什么顺序拿出来),如果相等就把左子树的左孩子和右子树的右孩子放入队列,把左子树的右孩子和右子树的左孩子放入队列
中间有一个不对称就返回false
直到队列为空返回true