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