一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
力扣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 <= Node.val <= 100
进阶:你可以运用递归和迭代两种方法解决这个问题吗?
二、思路分析:
-
这道题考察了什么思想?你的思路是什么?
递归写法:
这种题目,如果不是用程序做,那很简单,我们一眼就可能看出,但是要用计算机来判断就需要用计算机的思维去考虑。这个问题可以转换为:根节点的两个子树在什么情况下呈对称状态。
- 两颗子树的根节点值相等。
- 然后原二叉树根节点的左子树和右子树对称。
所以我们只需要判断节点值是否相等,然后从两边去递归检查是否对称。
-
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
不是,递归解法时刚开始把check函数放在了isSymmetric之后,导致报错。
-
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
看到了别人的非递归写法,非递归写法的好处就是使用队列来辅助。
三、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);
}
别人的解法:
四、总结:
这是一道简单题目,该题也是入门深度优先算法和广度优先算法的好题目。有人说字节考过这道题目,咱们还是得多刷几遍!