给你一个二叉树的根节点 root
, 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3] 输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3] 输出:false
提示:
- 树中节点数目在范围
[1, 1000]
内 -100 <= Node.val <= 100
【分析】
对称二叉树,则左子树和右子树镜像对称。(相当于将左子树折叠过来和右子树完全重叠。)
可通过递归来判断,遍历左右两棵树是否互为镜像对称。
对于递归函数,需要判断:如果两棵树都为空,则为对称二叉树,如果两棵树只有其中一棵为空,则不是。如果根节点相同,则将该树的左子树和右子树的数据进行比较,如果相同则继续向后遍历。
具体案例分析1:
输入:root = [1,2,2,3,4,4,3] 输出:true
首先进入主函数,isSymmetric,返回check(root,root),进入调用的函数check,p=q=1,进入check(p->left,q->right)&&check(p->right,q->left);分别比较左子树和右子树。
此时p=2,q=2;相等,进入check(p->left,q->right)&&check(p->right,q->left);针对check(p->left,q->right),此时p=3,q=3,相等,再次进入check(p->left,q->right)&&check(p->right,q->left);p和q均为空,返回true;针对check(p->right,q->left),此时p=3,q=3,相等,再次进入check(p->left,q->right)&&check(p->right,q->left);p和q均为空,返回true;(红色的表示在同一次的循环),左右均为空后,不在进入循环返回true。
具体案例分析2:
输入:root = [1,2,2,null,3,null,3] 输出:false
首先进入主函数,isSymmetric,返回check(root,root),进入调用的函数check,p=q=1,进入check(p->left,q->right)&&check(p->right,q->left);分别比较左子树和右子树。
此时p=2,q=2;相等,进入check(p->left,q->right)&&check(p->right,q->left);针对check(p->left,q->right),此时p=NULL,q=3,执行if(p == NULL || q == NULL),直接返回 false,循环结束,不是对称二叉树。
C语言具体代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool check(struct TreeNode *p,struct TreeNode *q){
if(p == NULL && q == NULL){
return true;
}
if(p == NULL || q == NULL){
return false;
}
if(p ->val == q->val){
return check(p->left,q->right)&&check(p->right,q->left);//函数调用
}
else{
return false;
}
}
bool isSymmetric(struct TreeNode* root) {
return check(root,root);
}
时间复杂度O(n);空间复杂度O(n)