101. 对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/symmetric-tree
思路:
根节点左子树和右子树为对称树,左节点的左儿子和右节点的右儿子相同,所以就用两个指针,两个指针指向不同,然后往下递归。
代码:
class Solution {
public:
bool check(TreeNode *p, TreeNode *q) {
if (!p && !q) return true;
if (!p || !q) return false;
//递归判断,左指针的左边和右指针的右边,左指针的右边和右指针的左边
return p->val == q->val && check(p->left, q->right) && check(p->right, q->left);
}
bool isSymmetric(TreeNode* root) {
if (!root) return true;
//两个指针,指向不同
return check(root->left, root->right);
}
};
PS:递归转迭代的方法多用队列。
class Solution {
public:
bool check(TreeNode* v,TreeNode* u){
queue<TreeNode*> q;
q.push(u);
q.push(v);
while(!q.empty()){
//每次取两个指针,因为我们放入的时候也是按照对策放置。
u = q.front();q.pop();
v = q.front();q.pop();
if (!u&&!v) continue;
if ((!u||!v) || (u->val!=v->val)) return false;
q.push(u->left);
q.push(v->right);
q.push(u->right);
q.push(v->left);
}
return true;
}
bool isSymmetric(TreeNode* root) {
if (!root) return true;
return check(root->left,root->right);
}
};