Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述:
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
例如,二叉树 [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:
输入:root = [1,2,2,3,4,4,3] 输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3] 输出:false
限制:0 <= 节点个数 <= 1000
思路分析:
这题作为力扣的基础题,主要考查了二叉树查询和条件搜索的思想,这里我们主要使用深度优先遍历进行解决。
我们根据题目可以发现,要想判断一棵树是否为镜像对称树,只需要判断其是否满足以下几个条件:
- 根节点的左子树和右子树的值相等
- 当左子树为空的时候,右子树也应该为空
代码:
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root == NULL) return true;// 如果根节点为空,直接返回true
return compare(root->left, root->right);
}
bool compare(TreeNode* left, TreeNode* right)
{
// 左子树和右子树同时为空,代表这段子树相等
if(left == NULL && right == NULL) return true;
// 如果左子或者右子有一个为空,或者两个节点的值不相等,返回false
if(left == NULL || right == NULL || left->val != right->val ) return false;
//继续对比两个节点的左右子节点是否对应相等,左节点的左子节点 == 右节点的右子节点,且左节点的右子节点 == 右节点的左子节点
return compare(left->left,right->right) && compare(left->right,right->left);
}
};
注意:最后还需要判断左边的左边和右边的右边比较 && 左边的右边和右边的左边比较,如果相等,才能说明这个根节点的左右子节点相等;
总结:
对于树的遍历,我们可以先确定主要思路,再决定使用哪一种搜索模板,最后实现编码完成对题目的AC