题意:判断给定的二叉树是否中心对称。
初步分析:递归判断。
要判断左右子树是否想等,所以需要单独封装一个方法来递归调用
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null)
return true;
else
return isequal(root.left, root.right);
}
private boolean isequal(TreeNode left, TreeNode right){
if(left==null && right==null) //都为空是相等的。
return true;
else if(left ==null || right==null) //一者为空一者不为空是不相等的。
return false;
if(left.val!=right.val) //在不为空的前提下,值不相等是不相等的。
return false;
return isequal(left.left, right.right) && isequal(left.right, right.left); //左子树的右子树和右子树的左子树相等且左子树的左子树和右子树的右子树相等才是相等的。
}
}
再参考一份广搜的代码( casegame):
1 第一层根节点判断
2.第二层root.left 和 root.right 判断,放入队列
3.当队列不为空开始循环
4.先取出队列里的左结点和右结点,判断值。
5 判断结构,当左子树的左结点和右子树的右结点都不为空的时候,依次加入队列
6 判断结构,当左子树的右结点和右子树的左结点都不为空的时候,依次加入队列
#注意对结构和值是否相等的判断
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null)
return true;
Queue<TreeNode> queue = new LinkedList<>();
TreeNode left = root.left;
TreeNode right = root.right;
if(left == null || right == null)
return left == right;
queue.add(left);
queue.add(right);
while(!queue.isEmpty()){
left = queue.poll();
right = queue.poll();
//check value
if(left.val != right.val) return false;
//check structure : part 1
if(left.left != null && right.right != null){
queue.add(left.left);
queue.add(right.right);
}
else if(!(left.left == null && right.right == null)){
return false;
}
//check structure : part 2
if(left.right != null && right.left != null){
queue.add(left.right);
queue.add(right.left);
}
else if(!(left.right == null && right.left == null)){
return false;
}
}
return true;
}
}