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
思路(递归)
比较是否为镜像的,则对应相等。一个不好表示,用两个指针来递归移动。因为是镜像,所以一个向左递归,另一个就对应向右递归。
- 先判断结点的存在情况
- 再判断值的相等情况
- 往后递归
源代码
class Solution {
public:
bool check(TreeNode* p, TreeNode* q) { // 自己创建函数,让两个指针顺着树左右递归
if (p == nullptr && q == nullptr) { // 同时为空,对称,则返回true
return true;
}
if (p == nullptr || q == nullptr) { // 一个为空,一个不为空,不对称,则返回false
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);
}
};
思路(迭代)
用队列的方法,开始入队两个root节点
- 每次取出两个元素,每取出一次就推出一个,否则第二次取得还是第一个元素
- 先判断空节点情况
- 再判断值是否相等
- 入队,入四次队列,因为镜像相当于对应两个树(画图好理解)
源代码
class Solution {
public:
bool check(TreeNode* p, TreeNode* q) { // 自己创建函数,让两个指针顺着树左右递归
queue<TreeNode*> queue;
queue.push(p);、、
queue.push(q);
while (!queue.empty()) {
TreeNode* node_p = queue.front();// p入队列
queue.pop();
TreeNode* node_q = queue.front();// q入队列
queue.pop();
if (!node_p && !node_q) {
continue;
}
if (!node_p || !node_q) {
return false;
}
if (node_p->val != node_q->val) {// 值不相等,返回false
return false;
}
// 对称入队
queue.push(node_p->left);
queue.push(node_q->right);
// 对称入队
queue.push(node_p->right);
queue.push(node_q->left);
}
return true;
}
bool isSymmetric(TreeNode* root) {
return check(root, root);
}
};