当前位置 博文首页 > Aaron_Yang:LeetCode101:对称二叉树(递归法+迭代法)

    Aaron_Yang:LeetCode101:对称二叉树(递归法+迭代法)

    作者:[db:作者] 时间:2021-07-17 15:48

    题目:

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

    示例:(如图)

    在这里插入图片描述

    方法一(递归法):

    思路:

    ?????首先要比较两个结点值相同与否,必须要判断这两个结点是否为空,否则会出现空指针的问题。结点为空有三种情况(两两为空:false;都为空:true)。然后剩下的就是左右结点不为空的情况,如果值不相同,就返回false;最后相同的情况,就进入递归,只要当左右都对称才返回true。

    代码:
    /**
     * 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 isSymmetric(TreeNode* root) {
           if(root==nullptr)    return true;
           return compare(root->left,root->right);
        }
        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;
            //此时是左右结点都不为空,且数值相同的情况
            bool outside = compare(left->left,right->right);
            bool inside = compare(left->right,right->left);
            bool result = outside && inside;
            return result;
        }
    };
    

    方法二(迭代法):

    思路:

    ?????这里我使用了一个队列来比较两个树(根节点的左右子树)是否相互翻转,这里的条件判断的逻辑和递归的逻辑是基本一样的,因此不再赘述,直接看下列代码即可理解。

    代码:
    /**
     * 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 isSymmetric(TreeNode* root) {
            if(root==nullptr) return true;
            queue<TreeNode*>que;
            que.push(root->left);       //将左子树结点加入队列
            que.push(root->right);
            while(!que.empty())
            {
                TreeNode *leftNode = que.front();   que.pop();
                TreeNode *rightNode = que.front();  que.pop();
                //左右结点都为空
                if(!leftNode && !rightNode)
                    continue;
                //有一个不为空,或者值不相同
                if(!leftNode || !rightNode || leftNode->val!=rightNode->val)
                    return false;
                que.push(leftNode->left);
                que.push(rightNode->right);
                que.push(leftNode->right);
                que.push(rightNode->left);
            }
            return true;
    
        }
    };
    
    cs