题目描述
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
进阶:
你可以运用递归和迭代两种方法解决这个问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/symmetric-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
白话题目:
算法:
递归算法:
子树对称条件:
1.它们的两个根结点具有相同的值
2.每一个树的【右】子树都与另一个树的左子树镜像对称
(一)同时为空,对称
(二)只有一个为空,一定不对称
(三)一个的左和另一个的右;一个的右和另一个的左
详细解释关注 B站 【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB
C语言完全代码
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
typedef struct TreeNode
{
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
static bool Symmetric(struct TreeNode* leftNode, struct TreeNode* rightNode)
{
if (NULL == leftNode && NULL == rightNode)
{
return true;
}
if (NULL == leftNode || NULL == rightNode)
{
return false;
}
return (leftNode->val == rightNode->val) && Symmetric(leftNode->right, rightNode->left) && Symmetric(leftNode->left, rightNode->right);
}
bool isSymmetric(struct TreeNode* root)
{
return Symmetric(root, root);
}
void preorder(TreeNode * node)
{
if(node!=NULL)
{
printf("%d ",node->val);
preorder(node->left);
preorder(node->right);
}
}
int main()
{
//[1,2,2,3,4,4,3] [1,2,2,null,3,null,3]
TreeNode n1;
TreeNode n2;
TreeNode n3;
TreeNode n4;
TreeNode n5;
TreeNode n6;
TreeNode n7;
n1.val=1;
n2.val=2;
n3.val=2;
n4.val=3;
n5.val=4;
n6.val=4;
n7.val=3;
n1.left=&n2;
n1.right=&n3;
n2.left=&n4;
n2.right=&n5;
n3.left=&n6;
n3.right=&n7;
n4.left=NULL;
n4.right=NULL;
n5.left=NULL;
n5.right=NULL;
n6.left=NULL;
n6.right=NULL;
n7.left=NULL;
n7.right=NULL;
preorder(&n1);
bool result =isSymmetric(&n1);
printf("\n");
printf("%d\n",result );
return 0;
}