1.题目
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.题解
递归
就是官方题解,挺正常的思路,从根节点开始分别往左往右对比元素。
维护两个指针,当第一个再向左移动,另一个向右移动;当第一个向右移动,另一个向左移动,当全为空时,返回正确;其中一个为空则为错误。
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);
}
};