OJ:对称二叉树 | C

题目链接:101. 对称二叉树 - 力扣(LeetCode)

题目内容

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例:
OJ:对称二叉树 | C_第1张图片

输入:root = [1,2,2,3,4,4,3]
输出:true

思路

  • 思路一:翻转,遍历树,每个结点交换左右孩子,看最终的结果是否与原树相同?
    OJ:对称二叉树 | C_第2张图片
    侵入式编程,这样会改变原树(为了保护原树,修改原树前需要copy一份原树)

  • 思路二:层序遍历(详见→判断完全二叉树(层序遍历)| C),每层判断是否是回文结构(详见→[数据结构初阶] | OJ | 【快慢指针】 | 【思路+源码】题:链表的中间结点、链表倒数第k个结点、回文结构)
    OJ:对称二叉树 | C_第3张图片

  • ⭐思路三:遍历树的结点 (递归),分别以每个结点为根,往下构成的左右子树都必须是成对,对称即左右对称 = 根(左子树的根和右子树的根)相等 + 左 和 右相等 + 右 和 左相等(子函数)
    OJ:对称二叉树 | C_第4张图片

解:

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);
}

你可能感兴趣的:(数据结构初阶,题,c语言,链表,数据结构)