101. 对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:
输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:
输入:root = [1,2,2,null,3,null,3]
输出:false
提示:
树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100
思路1:
递归,因为是轴对称,肯定从左子树最左边,和右子树最右边来对称,所以对两个子树分别用后序遍历,
左子树左右中,右子树右左中
1.左右子树都空,对称
2.左空右不空,或者右空左不空,不对称
3.左右都不空,但是val不相等,不对称
代码
/**
* 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 cmp(TreeNode* left, TreeNode* right) {
if (left == NULL && right != NULL) return false;//左空右不空,不对称
else if (left != NULL && right == NULL) return false; //右空左不空
else if (left == NULL && right == NULL) return true;//都空,对称
else if (left->val != right->val) return false;//不空但是值不相等
bool outside = cmp(left->left, right->right);//左子树:左右中,右子树:右左中
bool inside = cmp(left->right, right->left);
bool tt = outside & inside; //中
return tt;
}
bool isSymmetric(TreeNode* root) {
if (root == NULL) return false;
return cmp(root->left, root->right);
}
};
思路2:
迭代的方法,用队列来写
左子树朝左走,右子树朝右走
1.左右子树都空,对称,跳过
2.左空右不空,或者右空左不空,不对称
3.左右都不空,但是val不相等,不对称
左子树的左子树和右子树的右子树,左子树的右子树和右子树的左子树两两比较
代码
/**
* 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 isSymmetric(TreeNode* root) {
if (root == NULL) return true;
queue<TreeNode*> que;
que.push(root->left);
que.push(root->right);
while (!empty(que)) {
TreeNode* l = que.front();//将左右结点取出判断
que.pop();
TreeNode* r = que.front();
que.pop();
if (!l && !r) {//左右都空,跳过
continue;
}
if (!l || !r || l->val != r->val) {//左空右不空,右空左不空,都不空单不相等,都返回false
return false;
}
que.push(l->left);
que.push(r->right);
que.push(l->right);
que.push(r->left);
}
return true;
}
};