101. Symmetric Tree
难度:easy
问题描述:对称树
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree [1,2,2,3,4,4,3] is symmetric:
1
/ \
2 2
/ \ / \
3 4 4 3
But the following [1,2,2,null,3,null,3] is not:
1
/ \
2 2
\ \
3 3
解法1
思路:这道题和上一道100题有点像,可以使用递归,也可以使用栈
/**
* 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|| (!root->left && !root->right)) return true;
// if(!root->left&&root->right || root->sleft && !root->right || root->left->val != root->right->val) return false;
return isSymmTree(root->left,root->right);
}
bool isSymmTree(TreeNode* left,TreeNode* right)
{
if(!left && !right) return true;
if(!left&&right || left&&!right || left->val!=right->val)return false;
return isSymmTree(left->left,right->right)&&isSymmTree(left->right,right->left);
}
};
解法2
/**
* 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|| (root->left==nullptr && root->right==nullptr)) return true;
if(!root->left&&root->right || root->left && !root->right || root->left->val != root->right->val) return false;
stack<TreeNode*> s1;
stack<TreeNode*> s2;
s1.push(root->left);
s2.push(root->right);
while(!s1.empty())
{
TreeNode* n1 = s1.top();
s1.pop();
TreeNode* n2 = s2.top();
s2.pop();
if((!n1->left && n2->right)||(n1->left && !n2->right)) return false;
if(n1->left && n2->right)
{
if(n1->left->val == n2->right->val)
{
s1.push(n1->left);
s2.push(n2->right);
}else{
return false;
}
}
if((!n1->right && n2->left)||(n1->right && !n2->left)) return false;
if((n1->right && n2->left))
{
if(n1->right->val == n2->left->val){
s1.push(n1->right);
s2.push(n2->left);
}else{
return false;
}
}
}
return s1.size()==s2.size();
}
};