给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/symmetric-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
bool isSymmetric2(struct TreeNode* q, struct TreeNode* p) {
if (p == NULL && q == NULL) { return 1; }
if (p == NULL && q != NULL) return 0;
if (p != NULL && q == NULL) return 0;
int flag1 = q->val == p->val;
// if(flag1==0) return 0; //可以加一个判定条件,如果值不相等
//直接返回0
int flag2 = isSymmetric2(q->left, p->right) && isSymmetric2(q->right, p->left);//判断接下来的
return (flag1 && flag2);//如果任意一个flag为0,则不是镜像二叉树!(https://img-blog.csdnimg.cn/20201106170022287.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L20wXzQ2OTA4MzMy,size_16,color_FFFFFF,t_70#pic_center)
}
bool isSymmetric(struct TreeNode* root) {
if (root == NULL)return 1;//如果是空树返回1
else return isSymmetric2(root->left,root->right);
}
由于是递归,空间占用率比较高。
在解题时,考虑到,如果只传递一个节点的地址。只能判断该节点的,子节点。而镜像二叉树与该节点的子节点无关。镜像二叉树,即一个节点向左,那么另一个节点就要相右。本算法,采取了由顶向下的思路。
传递两个地址,进行镜像递归。在思考,边界条件即可。其中任意一步不符合镜像二叉树,则不是镜像二叉树。