力扣101. 对称二叉树

109 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

力扣101. 对称二叉树

一、题目描述:

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

示例 1:

img

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

示例 2:

img

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

提示:

树中节点数目在范围 [1, 1000] 内 -100 <= Node.val <= 100

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

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    递归写法:

    这种题目,如果不是用程序做,那很简单,我们一眼就可能看出,但是要用计算机来判断就需要用计算机的思维去考虑。这个问题可以转换为:根节点的两个子树在什么情况下呈对称状态。

    1. 两颗子树的根节点值相等。
    2. 然后原二叉树根节点的左子树和右子树对称。

    所以我们只需要判断节点值是否相等,然后从两边去递归检查是否对称。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    不是,递归解法时刚开始把check函数放在了isSymmetric之后,导致报错。

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    看到了别人的非递归写法,非递归写法的好处就是使用队列来辅助。

    image-20220404200553683

img

三、AC 代码:

 /**
  * Definition for a binary tree node.
  * struct TreeNode {
  *     int val;
  *     struct TreeNode *left;
  *     struct TreeNode *right;
  * };
  */
 ​
 bool check(struct TreeNode* ltree,struct TreeNode* rtree){
     //如果两条子树都为空,肯定对称。
     if(ltree==NULL && rtree == NULL ){
         return true;
     }
     //如果一棵子树空,另一课不空就不对称。
     if(ltree == NULL || rtree == NULL){
         return false;
     }
     return ltree->val == rtree->val && check(ltree->right,rtree->left) && check(ltree->left,rtree->right);
 ​
 }
 bool isSymmetric(struct TreeNode* root){
     return check(root,root);
 }

别人的解法:

image-20220404200725806

四、总结:

这是一道简单题目,该题也是入门深度优先算法和广度优先算法的好题目。有人说字节考过这道题目,咱们还是得多刷几遍!