首页 > 其他分享 >LC 101.对称二叉树

LC 101.对称二叉树

时间:2024-03-28 12:03:00浏览次数:16  
标签:null LC right 二叉树 && 101 root 节点 left

101. 对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入: root = [1,2,2,3,4,4,3]
输出: true

示例 2:

输入: root = [1,2,2,null,3,null,3]
输出: false

提示:

  • 树中节点数目在范围 [1, 1000]
  • − 100 ≤ N o d e . v a l ≤ 100 -100 \leq Node.val \leq 100 −100≤Node.val≤100

进阶: 你可以运用递归和迭代两种方法解决这个问题吗?

解法一(递归)

思路分析:

  1. 对于该题使用递归思路比较简单,即比较对称位置的两个节点是否相等

  2. 对于递归的参数,则传递需要比较的两个节点,同时返回值则返回比较结果,相等则继续返回true,不相等则返回false

  3. 对于递归的边界条件,需要注意的是,当对称位置两个节点均为null时,也算相等,所以两个节点存在且只有一个节点为null时,显然直接返回false

  4. 至于递归过程,则是判断当前 对称位置的两个节点是否相等,然后继续往下递归

实现代码如下:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        // 注意题目条件 root != null
        return doIsSymmetric(root.left, root.right);
    }
    private boolean doIsSymmetric(TreeNode left, TreeNode right) {
        if (left == null && right != null)
            return false;
        if (left != null && right == null)
            return false;
        if (left == null && right == null)
            return true;
        // 相等比较 节点值        然后接着判断其余节点
        return left.val == right.val && doIsSymmetric(left.left, right.right) && doIsSymmetric(left.right, right.left);
    }
}

提交结果如下:

解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:40.4 MB,击败了13.09% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n),对二叉树的节点进行遍历

  • 空间复杂度: O ( n ) O(n) O(n),考虑递归对栈的消耗

解法二(迭代+栈)

思路分析:

  1. 根据递归,在计算机底层使用栈来实现,所以对于该题可以使用栈来进行迭代求解

  2. 因为题目给出二叉树至少有一个根节点,且对于根节点是否对称不需判断,因此可以使用两个栈,分别对二叉树的左右子树进行遍历。

  3. 根据对称,对二叉树的左子树采用中左右的顺序进行遍历,对于二叉树的右子树采用中右左的顺序进行遍历,然后判断是否对称。

实现代码如下:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        // 注意题目条件 root != null
        if  (root.left == null && root .right != null)
            return false;    // 边界
        if (root.left == null && root.right == null)
            return true;    // 边界特殊情况
        if (root.left != null && root.right == null)
            return false;
        Deque<TreeNode> leftSt = new LinkedList<>();    // 对左子树按 中左右 进行遍历
        Deque<TreeNode> rightSt = new LinkedList<>();    // 对右子树按 中右左 进行遍历
        leftSt.push(root.left);        // 左子树第一个节点进栈
        rightSt.push(root.right);    // 右子树第一个节点进栈
        while (!leftSt.isEmpty() && !rightSt.isEmpty()) {
            TreeNode left = leftSt.pop();
            TreeNode right = rightSt.pop();
            if (left == null && right == null)
                continue;
            if (left == null && right != null)
                return false;
            if (left != null && right == null)
                return false;
            if (left.val != right.val)
                return false;
            // 左子树 先进右节点 再进左节点
            leftSt.push(left.right);
            leftSt.push(left.left);
            // 右子树 先进左节点 再进右节点
            rightSt.push(right.left);
            rightSt.push(right.right);
        }
        // 左右遍历栈 均为空 则说明对每个节点均完成对比
        return leftSt.isEmpty() && rightSt.isEmpty();
    }
}

提交结果如下:

解答成功:
执行耗时:1 ms,击败了18.71% 的Java用户
内存消耗:40.7 MB,击败了5.07% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n ) O(n) O(n)

  • 空间复杂度: O ( n ) O(n) O(n)

总结:可进一步优化,使用一个双端队列,模拟两个栈

标签:null,LC,right,二叉树,&&,101,root,节点,left
From: https://blog.csdn.net/qq_61457746/article/details/137107079

相关文章

  • 二叉树理论基础
    结点的度:树中每个结点具有的子树数或者后继结点数称为该结点的度分支结点:度大于0的结点称为分支结点或非终端结点。度为1的结点称为单分支结点,度为2的结点称为双分支结点...树的度:树中所有结点的度的最大值称之为树的度。叶子结点(叶节点):度为0的结点称为叶子结点或终端结点孩子......
  • 二叉树的算法实现
       实例:     ......
  • libVLC 动态视频壁纸
    在Windows上,你可能需要使用WindowsAPI来设置壁纸,而在Linux上,你可能需要使用某种桌面环境特有的方法。在macOS上,这一功能可能受到限制。效果图如下所示:以下是一个简单的示例,说明了如何在Windows上使用C++和libVLC库来实现这一功能。请注意,这个示例可能需要根......
  • libVLC 视频抓图
    Windows操作系统提供了多种便捷的截图方式,常见的有以下几种:全屏截图:通过按下PrtSc键(PrintScreen),可以截取整个屏幕的内容。截取的图像会保存在剪贴板中,可以通过Ctrl+V粘贴到图片编辑工具或其他软件的输入框中。当前窗口截图:同时按下Alt + PrtSc键,可以截取当前活动的窗口。同......
  • 【题解】P10235 [yLCPC2024] C. 舞萌基本练习
    P10235舞萌基本练习题解思路看到最大值最小首先考虑二分答案。由于答案满足单调性,可以二分不优美度的最大值,也就是逆序对数的最大值。我们在每次增加一个元素的时候都要求解当前区间的逆序对数,所以不能用归并排序求逆序对数,考虑树状数组解法。如果不会树状数组求逆序对,请出......
  • nc51012 小猫爬山
    有n只猫,重量分别为C[i],要将所有小猫都放进缆车里,缆车的最大承重为W,问至少要多少辆缆车才能装下?1<=n<=18;1<=C[i]<=W<=1e8n比较小,可以暴力搜索,dfs(x,g)表示当前已经分了g个组,考虑如何分配第x只猫,枚举将猫放进g组中的每一个,另外也可以让它单独一组。按体重从大到小排序,可以触发剪......
  • 【华为OD机试真题】C卷-二叉树的广度优先遍历(JAVA)
    一、题目描述【华为OD机试真题】C卷-二叉树的广度优先遍历(JAVA)题目描述:有一棵二叉树,每个节点由一个大写字母标识(最多26个节点)。现有两组字母,分别表示后序遍历(左孩子->右孩子->父节点)和中序遍历(左孩子->父节点->右孩子)的结果,请你输出层序遍历的结果。二、输入输出输入......
  • 889. 根据前序和后序遍历构造二叉树
    给定两个整数数组,preorder和postorder,其中preorder是一个具有无重复值的二叉树的前序遍历,postorder是同一棵树的后序遍历,重构并返回二叉树。如果存在多个答案,您可以返回其中任何一个。https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-postorde......
  • (less) calc运算为什么不生效? 变量如何使用?
    less样式预处理器calc运算为什么不生效?变量如何使用?======答案如下见代码:<template><divclass="outer"><divclass="top"></div><divclass="box">helloworld</div><divclass="con"><......
  • P10185的题解
    (一)考虑对每一种颜色单独求解。对于一次第\(k\)种的“循环”,美丽度会加上\[\sum_{i=1}^{a_k}C_{n}^{i}\timesv_k^{i}=(v_k+1)^{a_k}-1\]相信大家都学过二项式定理。“循环”次数取决于其他珠子是否出现,即\(2^{\sum_{i=1}^{a_i}-a_k}\)。再将两式相乘就愉快AC了。(二)警......