对称的二叉树
题目:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
限制:
0 <= 节点个数 <= 1000
解题思路
首先对于这类二叉树匹配问题最先想到的就是利用递归方法来解决。而对于递归求解树的的问题我认为求解过程一般都可以分为下面两步:
- 先将根节点匹配;
- 根节点匹配后,对子树进行匹配。
其次对称二叉树应该满足以下三个条件:(L与R为二叉树任意两个对称节点)
- L->val=R->val :即此两对称节点值相等。
- L->left->val = R->right->val:即 L 的左子节点 和 R 的右子节点对称;
- L->right->val = R->left->val :即 L 的 右子节点 和 R 的 左子节点对称。
对于上一题树的镜像的问题以及这题树的对称问题,它参与匹配的二叉树都是一棵,所以通常是让它与自身匹配;而当遇到一些两树及以上的树相匹配时,通常就是让它们互相匹配。
本题的算法流程:
-
先判断根节点,若为空,直接返回true
-
根节点判断完后,对其左右子树进行判断(调用AlikeB())
-
若左右子树为空,返回true
若左右子树只有一个为空,返回false
若左右子树节点值不等,false -
递归判断断r1的左与r2的右以及r1的右与r2的左是否相等
代码展示
代码如下:
class Solution {
public:
bool isSymmetric(TreeNode* root) {
//若为空树,则直接返回true
if(!root) return true;
//判断左右子树
return AlikeB(root->left,root->right);
}
bool AlikeB(TreeNode* r1,TreeNode* r2)
{
//若左右为空,则返回true
if(!r1 && !r2) return true;
//若左右有一个为空,则返回false
if(!r1 || !r2) return false;
//若左右的值不同,则返回false
if(r1->val != r2->val) return false;
//递归判断r1的左与r2的右以及r1的右与r2的左是否相等
return AlikeB(r1->left,r2->right) && AlikeB(r1->right,r2->left);
}
};
执行用时:4 ms, 在所有 C++ 提交中击败了93.35%的用户
内存消耗:15.8 MB, 在所有 C++ 提交中击败了82.75%的用户