LeetCode 101. 对称二叉树

题目:
给定二叉树,判断是否对称(结构/值)

解法:
我自己做的时候用的是BFS的做法,为了区分不同层用了两个队列。参考了一下题解发现DFS也可以做(每次递归都是左右对称地加深一层),打破了自己原来对DFS的理解,因此也简单记录一下这道简单题。

代码:

// 队列做法
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        vector<TreeNode*> thisLayer = {root->left, root->right};
        vector<TreeNode*> nextLayer;
        while(thisLayer.size()) {
            if(!isSymmetric(thisLayer))
                return false;
            nextLayer.clear();
            for(TreeNode *p: thisLayer)
                if(p) {
                    nextLayer.push_back(p->left);
                    nextLayer.push_back(p->right);
                }
            swap(thisLayer, nextLayer);
        }
        return true;
    }

private:
    bool isSymmetric(vector<TreeNode*>& layer) {
        if(layer.size() % 2)
            return false;
        for(int i=0, j=layer.size()-1; i++,j--; i<j)
            if(!layer[i] !=  !layer[j] || (layer[i] && (layer[i]->val != layer[j]->val)))
                return false;
        return true;
    }
};

// DFS做法(左右同时DFS)
class Solution {
public:
    bool isSymmetric(TreeNode* root) {
        if(!root)
            return true;
        return dfs(root->left, root->right);
    }

private:
    bool dfs(TreeNode *left, TreeNode *right) {
        if(!left && !right)
            return true;
        if(!left || !right)
            return false;
        if(left->val != right->val)
            return false;
        return dfs(left->left, right->right) && dfs(left->right, right->left);
    }
};
posted @ 2022-03-30 13:40  Unparalleled_Calvin  阅读(17)  评论(0编辑  收藏  举报