二叉树(判断是否为对称二叉树)

题目(力扣):

二叉树(判断是否为对称二叉树)_第1张图片

观察题目,只需判断该二叉树是否对称。

判断二叉树是否对称,就可以换位去判断该二叉树的左子树和右子树是否对称。

这时就可以写一个辅助函数来方便判断。

该函数是判断两颗树是否镜像对称,这时就会发现,我们需要的这个函数和判断两棵树是否相等非常相似只需改变一些条件,(判断树是否相等是左节点的值等于另一棵树左节点的值,右节点的值等于另一棵树右节点的值而镜像则是相反,即左节点的值等于另一棵树右节点的值,右节点的值等于另一棵树左节点的值)

判断两树是否相等:

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if (p == NULL && q == NULL)
        return true;
    else if (p == NULL 
    || q == NULL)
        return false;
    else if (p->val != q->val)
        return false;
    else
        return isSameTree(p->left, q->left)
            && isSameTree(p->right, q->right);
}

而判断两树是否镜像对称:

二叉树(判断是否为对称二叉树)_第2张图片

只有这两处地方有改变。

其余地方一直相同。

剩余的isSymmetric函数中就是简单的判断了

二叉树(判断是否为对称二叉树)_第3张图片

完整代码:

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if (p == NULL && q == NULL)
        return true;
    else if (p == NULL 
    || q == NULL)
        return false;
    else if (p->val != q->val)
        return false;
    else
        return isSameTree(p->left, q->right)
            && isSameTree(p->right, q->left);
}
bool isSymmetric(struct TreeNode* root) {
    if(!root)
        return true;
    if((!root->left && root->right) 
    || (!root->right && root->left))
        return false;
    else if(root->left && root->right)
        return isSameTree(root->left,root->right);
    else
        return true;
}

题目的提交:

二叉树(判断是否为对称二叉树)_第4张图片

你可能感兴趣的:(OJ及其经典习题,数据结构,算法,c语言)