0
点赞
收藏
分享

微信扫一扫

力扣刷题 DAY_37 二叉树

沪钢木子 2022-03-13 阅读 58

Leetcode101

链接: 力扣 

题目:

给定一个二叉树,检查它是否是镜像对称的。 

示例1:

示例2: 

思路:

递归三部曲。

1.确定递归函数的参数和返回值

因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。

返回值自然是bool类型。

2.确定终止条件

要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!否则后面比较数值的时候就会操作空指针了。

节点为空的情况有:(注意我们比较的其实不是左孩子和右孩子,所以如下我称之为左节点右节点)

(1)左节点为空,右节点不为空,不对称,return false
(2)左不为空,右为空,不对称 return false
(3)左右都为空,对称,返回true

此时已经排除掉了节点为空的情况,那么剩下的就是左右节点不为空:

    左右都不为空,比较节点数值,不相同就return false

此时左右节点不为空,且数值也不相同的情况我们也处理了。

3.确定单层递归的逻辑

此时才进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。

    比较二叉树外侧是否对称:传入的是左节点的左孩子,右节点的右孩子。
    比较内测是否对称,传入左节点的右孩子,右节点的左孩子。
    如果左右都对称就返回true ,有一侧不对称就返回false 。

参考代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    bool compare(TreeNode *left, TreeNode *right) {
        if (left == nullptr && right != nullptr) {
            return false;
        }
        else if (left != nullptr && right == nullptr) {
            return false;
        }
        else if (left == nullptr && right == nullptr) {
            return true;
        }
        else if (left->val != right->val) {
            return false;
        }
        else {
            return compare(left->left, right->right) && compare(left->right, right->left);
        }
    }
    bool isSymmetric(TreeNode* root) {
        if (root) {
            return compare(root->left, root->right);
        }
        else {
            return true;
        }
    }
};
举报

相关推荐

0 条评论