28.对称的二叉树
一、题目描述:
判断一棵二叉树和它的镜像是否相同
二、示例:
输入:root = [1,2,2,3,4,4,3]
输出:true
三、解题思路:
本题无需使用比对翻转后的二叉树和原二叉树的方法,而可以边遍历边进行判断:
1. 二叉树对称需满足的条件:
- 当前两节点val值相等
- 左侧结点的左孩子和右侧结点的右孩子的val值相等
- 左侧结点的右孩子和右侧结点的左孩子的val值相等
2.算法实现:
- 整体思想:自顶向下递归,对每一对结点的上述三个条件进行判断。
- 函数:为控制处于对称位置的两结点,设置辅助函数
mycheck()
。 - 递归结束条件:
若两节点一方为空,一方非空,则为由结点个数引起的非对称;若两节点val值不同,则为结点值引起的非对称。
若三个条件均满足,一路判断至最底部(左右结点均为空),则对称。
AC代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
bool mycheck(struct TreeNode* Nleft,struct TreeNode* Nright){
if(Nleft==NULL&&Nright==NULL) return true; //表明判断到最底部均满足条件
if(!Nleft||!Nright||Nleft->val!=Nright->val) return false;
return mycheck(Nleft->left,Nright->right)&& mycheck(Nleft->right,Nright->left); //继续判断上述需满足的条件2,3
}
bool isSymmetric(struct TreeNode* root){
if(!root) return true;
return mycheck(root->left,root->right); //从根节点开始自顶向下判断
}