力扣101对称二叉树

文章介绍了两种判断二叉树是否对称的方法。一是递归法,通过比较当前节点的左右子节点及其子节点的对称性来实现。二是迭代法,利用队列进行广度优先遍历,逐层比较节点的对称性。两种方法都需要处理空节点和节点值相等的情况。
摘要由CSDN通过智能技术生成

af2f5d2838ea41bd889085c8f2e2a9ca.png

 方法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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值