每天一道leetcode 对称二叉树(递归和迭代)
101. 对称二叉树
难度简单825收藏分享切换为英文关注反馈
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
答:
递归:
bool check(struct TreeNode* le,struct TreeNode* ri)
{
if(!le&&!ri) return true;
if(!le||!ri) return false;
return le->val==ri->val &&check(le->left,ri->right)&&check(le->right,ri->left);
}
bool isSymmetric(struct TreeNode* root){
if(!root) return true;
return check(root->left,root->right);
}
注意:
- 发现很多题解包括官方的都没注意到,如果刚开始直接压入两边根节点,那么
return le->val==ri->val &&check(le->left,ri->right)&&check(le->right,ri->left);
在第一个check递归结束并返回后,第二个check会再便利一边。根节点的两个子节点遍历了两次并且顺序相反。
因为,第一次压入重复了,后面也会重复。
优化,刚开始直接压入左右子节点,注意另加判断跟节点是否位空
迭代:
迭代就是把递归用队列实现,就用的c++
class Solution {
public:
bool queue_isSymmetric(TreeNode* le,TreeNode *ri) {
queue <TreeNode*> q;
q.push(le);
q.push(ri);
while(!q.empty())
{
le=q.front();q.pop();
ri=q.front();q.pop();
if(!le&&!ri) continue;//到达叶子节点或者都为空,结束本轮
if(!le||!ri||le->val!=ri->val) return false;
q.push(le->left);
q.push(ri->right);
q.push(le->right);
q.push(ri->left);
}
return true;
}
bool isSymmetric(TreeNode* root)
{
if(!root)
return true;
return queue_isSymmetric(root->left,root->right);//不直接压入根节点,防止冗余(除了根节点其他的都会遍历两边)
}
};