题目描述
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
但是 [1,2,2,null,3,null,3] 则不是镜像对称的
- 递归法
首先判断当前根节点是否相同,之后判断两个树的左右节点是否相同,若都为空则也判断为相同,若有一项不相同则输出为否。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool isMirror(struct TreeNode* t1,struct TreeNode* t2)
{
if(t1==NULL&&t2==NULL) return true;
if(t1==NULL||t2==NULL) return false;
return (t1->val==t2->val)&&isMirror(t1->left,t2->right)&&isMirror(t1->right,t2->left);
}
bool isSymmetric(struct TreeNode* root){
return isMirror(root,root);
}
- 迭代法
使用一个队列进行迭代,不断放入当前两个根节点的左右子树进行比较,若不相同则直接输出否,若一个子树的左右节点都为空,则不再继续判断它的后续节点,直到所有子树的节点都为空,输出之前的判断结果。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
#define QUEUESIZE 400
bool isSymmetric(struct TreeNode* root){
if(root==NULL) return true;
struct TreeNode* q[QUEUESIZE];
int add=-1,out=-1;
q[++add]=root->left;
q[++add]=root->right;
while(out<add)
//当所有子节点都为空时,不再有能够输入的节点,取不出节点进行比较了
{
struct TreeNode* t1=q[++out];
struct TreeNode* t2=q[++out];
if(!t1&&!t2) continue;
if(!t1||!t2) return false;
if(t1->val!=t2->val) return false;
q[++add]=t1->left;
q[++add]=t2->right;
q[++add]=t1->right;
q[++add]=t2->left;
}
return true;
}