leetcode刷题日记——对称二叉树
[ 题目描述 ]:
[ 思路 ]:
- 递归,递归遍历树左右两边相对应的两个子节点,判断他们是否相同,相同则对称,不相同则不对称
- 运行如下
bool isSame(struct TreeNode* p,struct TreeNode* q){if(!p && !q) return true;if(!p || !q || p->val!=q->val) return false;return isSame(p->left,q->right) && isSame(p->right,q->left);
}bool isSymmetric(struct TreeNode* root) {return isSame(root->left,root->right);
}
[ 官方题解 ]:
- 一、递归,基本同上
- 二、迭代,引入一个队列,这是把递归程序改写成迭代程序的常用方法。初始化时我们把根节点入队两次。每次提取两个结点并比较它们的值(队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像),然后将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束
- C++代码如下
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);}
};