JAVA版本
解法一:
递归,递归的三要素:
1.确定递归函数的参数与返回值
2.确定递归的终止条件
3.确定递归的思路
本题中,要判断是否是二叉树,所以使用的是boolean类型,终止条件是,左右子树其中一个是null或者左右子树的值不相等。递归的是外层与外层结点,内层与内层的结点。只要内层与内层相同,且外层与外层相同,才返回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);
}
boolean compare(TreeNode left ,TreeNode right) {
if(left != null && right ==null){
return false;
}
if(right != null && left ==null){
return false;
}
if(right == null && left ==null){
return true;
}
if(left.val != right.val){
return false;
}
boolean outTreeNode = compare(left.left , right.right);
boolean intTreeNode = compare(left.right,right.left);
return outTreeNode && intTreeNode;
}
}
解法二:
使用队列来模拟结点的对比的过程。将外层结点与外层结点一起入队,内层与内层入队。最后比较这结点的值是否相同。
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
Queue <TreeNode> queue = new LinkedList<>();
queue.add(root.left);
queue.add(root.right);
while(!queue.isEmpty()){
TreeNode left = queue.poll();
TreeNode right = queue.poll();
if (left == null && right == null) {
continue;
}
if (left == null || right == null || left.val != right.val) { //将不符合题意的条件写在一起
return false;
}
//再判断,注意入队的顺序
queue.add(left.left);
queue.add(right.right);
queue.add(left.right);
queue.add(right.left);
}
return true;
}
}
解法三:使用栈,使用栈的思路与队列相同,不再赘述。
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
Stack <TreeNode> stack = new Stack<>();
stack.add(root.left);
stack.add(root.right);
while(!stack.isEmpty()){
TreeNode left = stack.pop();
TreeNode right = stack.pop();
if (left == null && right == null) {
continue;
}
if (left == null || right == null || left.val != right.val) {
return false;
}
//再判断,注意入队的顺序
stack.add(left.left);
stack.add(right.right);
stack.add(left.right);
stack.add(right.left);
}
return true;
}
}