力扣 101 对称二叉树【递归三步法】
全部刷题与学习记录
原题目
题目地址:101. 对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3]
是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3]
则不是镜像对称的:
1
/ \
2 2
\ \
3 3
考查知识点
递归三步法、二叉树中所有复杂的操作与最初(两层,三层)二叉树的操作都是一样的,只要在基础版本进行递归成功,后面复杂的情况就迎刃而解
自己的第一遍解法
最开始思路是:按照层序遍历将每一层的节点保存下来,然后从保存下来的数组使用双指针从首尾逐个比较
好的解法
【代码随想录】大佬给出了一种类似于后序遍历的解法
思路:判断二叉树镜像对称 等效于 判断根节点的左右子树是否相同,也就是说要同时遍历两颗子树,对于示例1中的对称二叉树,假设在第三层[3 4 4 3]
对比,前两个节点在左子树,后两个节点在右子树,使用left
表示左子树的当前节点,right
表示右子树的当前节点,需要从外向内进行比较。也就是先比较左子树左孩子与右子树右孩子,然后比较左子树右孩子与右子树左孩子。
按照递归三步法考虑:
1、返回值和参数:
既然是判断,返回值就是bool
;在同一时刻只比较左右子树对称位置上的节点,因此需要left
和right
两个TreeNode*
参数
2、递归结束条件:
首先需要解决空节点的问题,这里有三种情况,(1)左空&&右不空
,(2)左不空&&右空
,(3)左空&&右空
。排除(1)(2)(3)这三种情况后,剩下的就是 左不空&&右不空
,只有在这种前提下,左值==右值
才有必要继续递归查看下一层是否对称
//排除空节点
if (left == nullptr && right != nullptr) return false;
else if (left != nullptr && right == nullptr) return false;
else if (left == nullptr && right == nullptr) return true;
//排除空节点后,再排除两个结点不同
else if (left->val != right->val) return false;
3、单层递归逻辑:
逻辑就是需要对比下一层左右子树最外侧与最内侧的节点值是否相同
这里需要注意:如果画的图层数太多导致情况太复杂,可以先从(两层,三层)来画图思考。递归本身就是套娃,层数越多越难想
参考: