<LeetCode>对称二叉树

题目

对称二叉树

在这里插入图片描述

思路

判断树是否对称,那么就是判断根结点root的两个子树root.leftroot.right是否对称。
将特殊情况进行额外处理:
如根结点为空,根结点没有左右子树,那么也是对称二叉树,返回true

解决完特殊情况以后,那么就判断根结点的左右子树是否对称

假设根结点root的左子树的根结点为root1,根结点root的右子树的根结点为root2

那么就对这两个子树进行判断

判断
root1.left==root2.right?
root1.right==root2.left?

代码

/**
 * 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) {
    	//根结点为空
        if(root==null)
            return true;
         //根结点没有左右子树
        if(root.right==null && root.left==null)
            return true;
        if(root.right!=null && root.left!=null){
        	//判断根结点的左右子树是否对称
            return judge(root.left,root.right);
        }

        return false;
    }

    public boolean judge(TreeNode root1,TreeNode root2)
    {
        if(root1.val!=root2.val)
            return false;
        boolean flag1=true;   //记录左子树的left是否与右子树的right相等
        boolean flag2=true;   //记录左子树的right是否与右子树的left相等
        
		//一边为空一边不为空,则肯定非对称
        if(root1.left==null && root2.right!=null || root1.left!=null && root2.right==null
        || root1.right==null && root2.left!=null || root1.right!=null && root2.left==null)
            return false;

		//判断左子树的left是否与右子树的right相等
        if(root1.left!=null && root2.right!=null){
            flag1=judge(root1.left,root2.right);
        }
        //判断左子树的right是否与右子树的left相等
        if(root1.right!=null && root2.left!=null){
            flag2=judge(root1.right,root2.left);
        }

        return (flag1&&flag2);
    }
}

更新:

class Solution {
    public boolean isSymmetric(TreeNode root) {
    	//根节点无需判断左右对称,因此在这里就进行处理
        if(root==null){
            return true;
        }
		//判断左右子树是否对称,函数中递归进行判断
        return judge(root.left,root.right);
    }

    public boolean judge(TreeNode rootLeft,TreeNode rootRight){
        if(rootLeft==null && rootRight==null) {
            return true;
        }

        //有一者为空,则为false
        if(rootLeft==null || rootRight==null){
            return false;
        }
		
		//当前左右子树非对称的话,直接返回false,不再深入下一层
        if(rootLeft.val!=rootRight.val){
            return false;
        }else{
        	//深入下一层
            return judge(rootLeft.left,rootRight.right) && judge(rootLeft.right,rootRight.left);
        }
        
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
LeetCode是一个非常受欢迎的在线程序设计题库,其中包含了各种各样的算法问题。而对称美学则是指设计或艺术作品中呈现出的对称性,使人观察时能够感受到一种平衡、和谐和美感。 LeetCode的题目往往可以看作是一个个问题,而解决这些问题的算法和数据结构则可以视为对称美学的表现。 首先,LeetCode题目中常常要求我们设计对称的数据结构,例如对称的二叉树、堆、队列等等。这些对称性的设计让我们在解决问题时能够更加高效地处理数据,提高了程序的性能和稳定性。 其次,LeetCode的算法问题也常常要求我们设计对称的算法,例如字符串中的回文子串问题、数组中的最长递增子序列问题等等。这些对称性的算法设计让我们在解决问题时能够更加简洁、清晰地表达解决思路,使得我们的代码更加易读、易懂。 不仅如此,LeetCode题目中还有很多需要对称地解决问题的场景,例如求解一棵二叉树的镜像、判断一个字符串是否是回文串等等。这些对称的问题不仅仅是算法和数据结构的对称,更是让我们思考问题时能够从不同的角度出发,具备创造性和灵活性的体现。 总的来说,LeetCode对称美学体现在解决问题的算法和数据结构的对称性、算法的对称性以及解决问题的多样性上。这种对称美学不仅满足了人们对美感的需求,同时也能够提高我们解决问题的能力和水平。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值