题目:
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/symmetric-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一
递归版
优化后:
class Solution {
public:
bool judge(TreeNode* one,TreeNode* two){
if(one==nullptr && two==nullptr){
return true;
}
else if(one==nullptr || two==nullptr || one->val!=two->val){
return false;
}
else{
return judge(one->left,two->right)&&judge(one->right,two->left);
}
}
bool isSymmetric(TreeNode* root) {
if(root==nullptr){
return true;
}else{
return judge(root->left,root->right);
}
}
};
解法二:
左子树按根左右,右子树按根右左
class Solution {
public:
bool isSymmetric(TreeNode* root) {
stack<TreeNode*> s1;
stack<TreeNode*> s2;
TreeNode* node1;
TreeNode* node2;
int number1,number2;
if(root==nullptr){
return true;
}
else{
s1.push(root->left);
s2.push(root->right);
while(!s1.empty() && !s2.empty()){
node1=s1.top();
node2=s2.top();
s1.pop();
s2.pop();
if(node1==nullptr && node2==nullptr){
//cout<<33;
if(s1.empty()&&s2.empty()){
return true;
}
}
else if(node1==nullptr||node2==nullptr){
// cout<<36;
return false;
}
else{
number1=node1->val;
number2=node2->val;
if(number1!=number2){
//cout<<42;
return false;
}
else{
s1.push(node1->right);
s1.push(node1->left);
s2.push(node2->left);
s2.push(node2->right);
}
}
}
if(s1.empty()&&s2.empty()){
//cout<<56;
return true;
}
else{
return false;
}
}
}
};