方法1:递归法
递归三部曲
确定递归函数的参数和返回值,确定终止条件,确定单层递归的逻辑。
思路:传入左右结点,如果只有一个为空,返回false,如果都为空,说明没有子结点了,返回true,如果值不想等,返回false,如果值相等,分别调用函数比较外部结点和内部结点,看是否相等。
/**
* 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;
else if(left!=null&&right==null) return false;
else if(left==null&&right==null) return true;
else if(left.val!=right.val) return false;
//需要进入·下一层结点的情况
boolean out=compare(left.left,right.right);
boolean in=compare(left.right,right.left);
boolean resul=out&∈
return resul;
}
}
方法2:迭代法(队列)
思路:先把头结点的左右孩子入队列,进入循环,出队两次,比较两元素,不相等直接返回false,不为空且相等则将要两结点的左右子树按比较顺序入队列。直到队列为空,返回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) {
//迭代法
TreeNode l=root.left;
TreeNode r=root.right;
Queue<TreeNode>queue=new LinkedList<TreeNode>();
//两两入栈
queue.add(l);
queue.add(r);
//队列不为空继续循环
while(!queue.isEmpty())
{
//两两出栈
TreeNode left=queue.poll();
TreeNode right=queue.poll();
//出栈的两元素相等并且非空,将它们的左右孩子入栈
//只有一个为空,或者值不相等,说明不是对称二叉树
if(left==null&&right==null)
continue;
else if(left==null&&right!=null)
return false;
else if(left!=null