参考网站代码随想录 (programmercarl.com)
一、递归法
要想写出正确的递归法,需要给出正确的递归结束条件。在判断对称二叉树时,递归结束的条件是遇到不满足对称二叉树的节点
递归函数结束条件要写到递归函数体的最前面,如果遇到的左右节点不满足递归结束条件,则往下判断。
public boolean isSymmetric(TreeNode root) {
return compare(root.left,root.right);
}
public boolean compare(TreeNode left,TreeNode right){
if(left == null &&right != null){return false;}
if(left != null && right == null){return false;}
if(left == null && right == null){return true;}
if(left.val != right.val){return false;}
boolean anser1 = compare(left.right,right.left);
boolean anser2 = compare(left.left,right.right);
return (anser1 && anser2);
}
二、双头队列迭代法
public boolean isSymmetric(TreeNode root) {
if(root == null){return false;}
Deque<TreeNode> deq = new LinkedList<>();
deq.offerFirst(root.left);
deq.offerLast(root.right);
while (!deq.isEmpty()){
TreeNode leftNode = deq.pollFirst();
TreeNode rightNode = deq.pollLast();
if (leftNode == null && rightNode == null) {
continue;
}
if(leftNode == null && rightNode != null){return false;}
if(leftNode != null && rightNode == null){return false;}
if(leftNode.val != rightNode.val){
return false;
}
deq.offerFirst(leftNode.left);
deq.offerLast(rightNode.right);
deq.offerFirst(leftNode.right);
deq.offerLast(rightNode.left);
}
return true;
}