请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
对称的话,对于左右子树其
- 左子树的左儿子和右子树的右儿子值相等
- 右子树的左儿子和左子树的右儿子值相等
如果节点值相等的话,就去看其儿子节点,如果不相等直接返回false。当然二者若都是空也返回true。
class Solution {
public:
/**
*
* @param root TreeNode类
* @return bool布尔型
*/
bool isSymmetric(TreeNode* root) {
// write code here
return dfs(root,root);
}
bool dfs(TreeNode* l,TreeNode* r)
{
if(!l && !r) return true;
if(l->val==r->val)
{
return dfs(l->left,r->right) && dfs(l->right,r->left);
}
return false;
}
};
非递归版本有两个注意点:1)最初始加入的点不需要判断是否为空,如果不空的话加入,这个是不需要的 2)最后加入的几个节点是,左子树的左节点与右子树的右节点,左子树的右节点与右子树的左节点。注意顺序不要弄反了。
非递归版本一:
/**
* 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 isSymmetric(TreeNode* root) {
queue<TreeNode*> q;
q.push(root);
q.push(root);
while(!q.empty())
{
int n = q.size();
while(n)
{
TreeNode* l=q.front();
q.pop();
TreeNode* r=q.front();
q.pop();
n-=2;
if(!l && !r) continue;
if(!l || !r) return false;
if(l->val==r->val)
{
q.push(l->left);
q.push(r->right);
q.push(l->right);
q.push(r->left);
}
else return false;
}
}
return true;
}
};
非递归版本二
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(!root) return true;
queue<TreeNode*> q;
q.push(root->left);//注意这里不要先判断roo->left是否为空,再加入
q.push(root->right);
while(q.size())
{
auto l=q.front();q.pop();
auto r=q.front();q.pop();
if(!l && !r ) continue;
if(!l || !r || (l->val!=r->val)) return false;
q.push(l->left);
q.push(r->right);
q.push(l->right);
q.push(r->left);
}
return true;
}
};