首页 > 其他分享 >【剑指Offer】58、对称的二叉树

【剑指Offer】58、对称的二叉树

时间:2023-08-16 23:56:57浏览次数:40  
标签:结点 TreeNode 58 Offer queue 二叉树 return null

【剑指Offer】58、对称的二叉树

题目描述:

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

解题思路:

本题判断一棵树是不是对称的,和第18题可以对比分析:二叉树的镜像,和LeetCode第101题:101. 对称二叉树是同一道题。

解法一:递归法

《剑指Offer》中给出的解答是定义一种先遍历右子结点,再遍历左子结点的新遍历方法,称为前序遍历的对称遍历,实际上,我们不用这样,可以直接找到对称二叉树的规律:

对称二叉树满足:根结点的左右子树相同,左子树的左子树和右子树的右子树相同,左子树的右子树和右子树的左子树相同即可

根据以上规律,直接使用递归便可以写出对应的代码,并不难理解,可以结合以下几个实例进行分析。

解法二:迭代法(广度优先遍历)

广度优先遍历的一般做法是借助队列,这里我们可以在初始化时把根节点入队两次。每次提取两个结点并比较它们的值(队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像),然后将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。

这一方法的关键是队列中出队列的两个连续的结点就应当是对称树中相等的结点

举例:

编程实现(Java):

//解法一:递归法,时间复杂度O(n),空间复杂度O(n)
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;
    }
}
public class Solution {
    boolean isSymmetrical(TreeNode pRoot){
        //左的左,和右的右进行比较,左的右和右的左比较
        if(pRoot==null)
            return true;
        return isSymmetrical(pRoot.left,pRoot.right);
    }
    boolean isSymmetrical(TreeNode pleft,TreeNode pright){
        if(pleft==null && pright==null)
            return true;
        if(pleft==null || pright==null)
            return false;
        if(pleft.val!=pright.val)
            return false;
        return isSymmetrical(pleft.left,pright.right) && isSymmetrical(pleft.right,pright.left);
    }
}

//解法二:迭代法(广度优先遍历)时间复杂度O(n),空间复杂度O(n)
class Solution {
    public boolean isSymmetric(TreeNode root) {
        Queue<TreeNode> queue=new LinkedList<>();
        queue.add(root);
        queue.add(root);

        while(!queue.isEmpty()){
            TreeNode t1=queue.poll();
            TreeNode t2=queue.poll();
            if(t1==null && t2==null)
                continue;
            if(t1==null || t2==null)
                return false;
            if(t1.val!=t2.val)
                return false;
            
            queue.add(t1.left);
            queue.add(t2.right);
            queue.add(t1.right);
            queue.add(t2.left);
        }
        return true;
    }
}

标签:结点,TreeNode,58,Offer,queue,二叉树,return,null
From: https://www.cnblogs.com/bujidao1128/p/17636510.html

相关文章

  • 【剑指Offer】59、按之字形顺序打印二叉树
    【剑指Offer】59、按之字形顺序打印二叉树题目描述:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。解题思路:这道题仍然是二叉树的遍历,相当于层次遍历,可以和第22题:从上往下打印二......
  • 剑指 Offer 37. 序列化二叉树(困难)
    题目:classCodec{public:voidrserialize(TreeNode*root,string&str){//编码递归函数:将树按照前序遍历,放入str字符串中。每个节点元素用','分隔if(root==nullptr){//如果遇到空节点,写入"none"。str+="none,";}el......
  • 【题解】[ARC158C] All Pair Digit Sums
    传送门题目分析我们可以先从简单一点的情况开始分析,如果现在\(a_{[i]},a_{[j]}\)都不会进位,那么最后的\(f(a_{[i]}+a_{[j]})=f(a_{[i]})+f(a_{[j]})\)。证明如下:有两个数\(x=\overline{x_nx_{n-1}....x_1}\)和\(y=\overline{y_my_{m-1}...y_1}\)。令\(n\lem\),由于不会......
  • [代码随想录]Day19-二叉树part08
    题目:235.二叉搜索树的最近公共祖先思路:BST和普通二叉树不同的一点是可以根据特性来找最近公共祖先,只要找到第一个值比p大比q小(假设p<q)的节点返回即可。代码:/***Definitionforabinarytreenode.*typeTreeNodestruct{*Valint*Left*TreeNode......
  • AcWing 858. Prim算法求最小生成树
    题目给定一个$n$个点$m$条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。给定一张边带权的无向图$G=(V,E)$,其中$V$表示图中点的集合,$E$表示图中边的集合,$n=|V|,m=|E|$。由$V$中的全部$n$个......
  • P6584
    P6584题目描述小Z和\(m\)个Youyou在一棵树上相遇了!这棵树上,每条边的长度都是\(1\)。初始时,小Z在\(x\)号节点上,并且有一把射程为\(k\)的枪。因为小Z技术精湛,所以Youyou一打就死,而小Z永远不会死掉。小Z和Youyou都按回合行动,在每一回合中,按照下面的顺序......
  • CF1858A Buttons题解
    思路我们可以让两人先拿\(c\)里面的,因为\(a\)和\(b\)肯定是自己的,那么公共的“我”也要抢的越多越好,所以我们都要先拿\(c\)里面的。如果\(c\)是奇数,那么先手一定多拿\(1\)个\(c\)里面的,相当于先手可以拿\(a+1\)个,后手可以拿\(b\)个;如果\(c\)是偶数,那么两......
  • CF1858B The Walkway 图解
    思路注意:所有变量名与原题面相同。因为\(1\)号点必须吃一块饼干,所以我们可以在\(1\)立一个不可删除的商店,记为\(s_0\)。注意:如果\(1\)号附近本身就有一个商店,那就不用立。然后我们可以在\(n+1\)的位置立一个不可删除的商店,作为一个结束标志,记为\(s_{m+1}\)。......
  • CF1858C Yet Another Permutation Problem 题解
    思路这个题是一个简单的构造题。竟然比T2简单,也是少见我们可以首先从\(1\)开始不断乘以\(2\),像这样:\(1,2,4,8,16\cdots,2^x\),直到什么时候超过\(n\)就停止。这样相邻两个数字就可以凑出\(1,2,4,6,\cdots,2^{x-1}\),保证两两不同。然后我们可以从\(3\)开始不......
  • CH582 CH592 CH573 Central提高连接速度
    主机连接很慢,怎么解决?主机端开启高速扫描//TRUEtousehighscandutycyclewhencreatinglink#defineDEFAULT_LINK_HIGH_DUTY_CYCLEFALSE//FALSE改成TRUE,启动高速扫描,增加连接速度GAPRole_CentralEstablishLink(DEFAULT_LINK_HIGH_DUTY_CYCLE,......