题目链接:101. 对称二叉树 - 力扣(LeetCode)
给你一个二叉树的根节点 root , 检查它是否轴对称。
输入:root = [1,2,2,3,4,4,3]
输出:true
思路一:翻转,遍历树,每个结点交换左右孩子,看最终的结果是否与原树相同?
侵入式编程,这样会改变原树(为了保护原树,修改原树前需要copy一份原树)
思路二:层序遍历(详见→判断完全二叉树(层序遍历)| C),每层判断是否是回文结构(详见→[数据结构初阶] | OJ | 【快慢指针】 | 【思路+源码】题:链表的中间结点、链表倒数第k个结点、回文结构)
⭐思路三:遍历树的结点 (递归),分别以每个结点为根,往下构成的左右子树都必须是成对,对称即左右对称 = 根(左子树的根和右子树的根)相等 + 左 和 右相等 + 右 和 左相等(子函数)
bool _isSymmetric(struct TreeNode* root1,struct TreeNode* root2)
{
//根相等
if((root1==NULL)&&(root2==NULL))
return true;
if((root1==NULL)||(root2==NULL))
return false;
if(root1->val!=root2->val)
return false;
return _isSymmetric(root1->left,root2->right)
&& _isSymmetric(root1->right,root2->left);
}
bool isSymmetric(struct TreeNode* root){
return !root || _isSymmetric(root->left,root->right);
}