101.symmetric tree
题目描述
判断一个二叉树是不是对称的
思路
递归去判断子树是对称的,但是不会QAQ
官方题解
递归法
如果一个树的左右子树镜像对称,那么这个树是对称的。
两个树什么情况下互为镜像???
- 它们的两个根节点有相同的值
- 每个树的右子树和另外一个树的左子树镜像对称。
代码
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) {
return check(root, root);
}
};
迭代法
引入一个队列,把递归程序改写成迭代程序
初始化时我们把根节点入队两次。每次提取两个结点并比较它们的值(队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像),然后将两个结点的左右子结点按相反的顺序(左右右左)插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。
class Solution {
public:
bool check(TreeNode *u, TreeNode *v) {
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) {
return check(root, root);
}
};