题目描述:
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。
链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof/
1.递归
思路:递归的思路很容易想
- 两节点不同时为空时,则不是对称的
- 两节点同时为空,则是对称的
- 两节点值不相等时,则不是对称的
- 递归传递的条件,必须是一棵树的左边另一颗树的右边。和一颗树的右边和另一颗树的左边。
- 这样的树的比较最后,才是对称的。
代码:
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root == nullptr)
return true;
return _isSymmetric(root->left, root->right);
}
private:
bool _isSymmetric(TreeNode* _left, TreeNode* _right)
{
if(_left == _right)//同时为空
return true;
else if(_left == nullptr || _right == nullptr)//不同时为空
return false;
else if(_left->val != _right->val)//值不相等
return false;
//递归条件,左边的左树和右边的右树,左边的右树和右边的左树
return _isSymmetric(_left->left, _right->right) && _isSymmetric(_left->right, _right->left);
}
};
2. 迭代
迭代的时候,借助一个队列
- 最开始将头节点入队两次;
- 每一次比较两个节点之间值是否相等;
- 两边是否同时为空,同时为空时,则不做判断,跳出本次循环;
- 若不同为空,则肯定不是对称二叉树;
- 队列元素入队时,考虑顺序入队;
- 左边的左树和右边的右树;
- 左边的右树和右边的左树;
- 这样出队比较的就是对称的树。
代码
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root == nullptr)
return true;
queue<TreeNode*> _que;
_que.push(root);//根节点入队两次
_que.push(root);
while(!_que.empty())
{
TreeNode* _left = _que.front();//左边
_que.pop();
TreeNode* _right = _que.front();//右边
_que.pop();
if(_left == nullptr && _right == nullptr)//同时为空,跳出本次循环
continue;
else if(_left == nullptr || _right == nullptr)//不同时为空,返回false
return false;
else if(_left->val != _right->val)//值不相等,返回false
return false;
_que.push(_left->left);//入队顺序,左边的左树和右边的右树;
_que.push(_right->right);
_que.push(_left->right);//入队顺序,左边的右树和右边的左树;
_que.push(_right->left);
}
return true;
}
};