对称二叉树
- 理解题意:如果同时满足下面的条件,两个树互为镜像:
- 题解1 【栈】递归——DFS
- 题解2 【队列】迭代——BFS
给你一个二叉树的根节点 root , 检查它是否轴对称。
提示:
- 树中节点数目在范围 [1, 1000] 内
- -100 <=
Node.val
<= 100
进阶:你可以运用递归和迭代两种方法解决这个问题吗?
理解题意:如果同时满足下面的条件,两个树互为镜像:
- 它们的两个根结点具有相同的值
- 每个树的右子树都与另一个树的左子树镜像对称
题解1 【栈】递归——DFS
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool dfs(TreeNode* l, TreeNode* r){
if(!l && !r) return true;
// 前一个条件已经排除了全空
if(!l || !r) return false;
// 看题说话(记住!!!)
return l->val == r->val && dfs(l->left, r->right) && dfs(l->right, r->left);
}
bool isSymmetric(TreeNode* root) {
if(! root) return true;
return dfs(root->left, root->right);
}
};
题解2 【队列】迭代——BFS
class Solution {
public:
bool check(TreeNode* l, TreeNode* r){
queue<TreeNode*> que;
que.push(l);
que.push(r);
while(que.size()){
l = que.front();
que.pop();
r = que.front();
que.pop();
if(!l && !r) continue;
if(!l || !r) return false;
// l, r 非空
if(l->val != r->val) return false;
// 加入新的一层
// 不涉及到队列内的自动排序,所以保证顺序的情况下
// 加入空结点也没关系
// FIFO 所以左结点的左孩子+右结点的右孩子
que.push(l->left);
que.push(r->right);
// 左结点的右孩子+右结点的左孩子
que.push(l->right);
que.push(r->left);
}
return true;
}
bool isSymmetric(TreeNode* root) {
if(! root) return true;
return check(root, root);
}
};