版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhao5502169/article/details/90108171
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
\ \
3 3
做法就是,判断 根左右遍历 和 根右左遍历 是否相同。注意用BFS获得每层的做法是不对的(话说我最开始想到的竟然是这个做法。)
首先是递归的做法,这个比较容易
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool dfs(TreeNode* l,TreeNode* r){
if(l == nullptr && r == nullptr)
return true;
if(l == nullptr && r != nullptr)
return false;
if(l != nullptr && r == nullptr)
return false;
if(l->val != r->val) return false;
else
return dfs(l->left,r->right)&&dfs(l->right,r->left);
}
bool isSymmetric(TreeNode* root) {
if(root == nullptr) return true;
return dfs(root,root);
}
};
迭代的做法,就是非递归的遍历方式,进行对比。
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool dfs(TreeNode* l,TreeNode* r){
if(l == nullptr && r == nullptr)
return true;
else if(l == nullptr && r != nullptr)
return false;
else if(l != nullptr && r == nullptr)
return false;
else if(l->val != r->val)
return false;
else{
stack<TreeNode*> stl,str;
while(!stl.empty() || l != nullptr){
while(l != nullptr){
if(r == nullptr || l->val != r->val)
return false;
stl.push(l);
str.push(r);
l = l->left;
r = r->right;
}
//这里即使得到的l和r为空,下次依然会再次回到这里。
if(!stl.empty()){
if(str.empty()) return false;
l = stl.top();
stl.pop();
l = l->right;
r = str.top();
str.pop();
r = r->left;
}
}
if(!str.empty() || r != nullptr) return false;
}
return true;
}
bool isSymmetric(TreeNode* root) {
return dfs(root,root);
}
};