题目
给你一个二叉树的根节点 root , 检查它是否轴对称。
依旧是使用迭代和递归来完成
对于递归算法的话需要思考三要素,输入的话我们只需要选择一个节点的左右孩子即可,单次循环结束的条件的话有以下几种情况:左右都没孩子,那就是对称的了;左右只有一边有孩子,那就是不对称的了;左右都有孩子但是值不相等,那就是不对称了。需要注意的是并不是左右的节点相等就是对称了,单次循环并不代表整棵树。最后就是每次循环的逻辑,对于二叉树而言,整棵树的对称是最左侧和最右侧,然后再往里一侧,这样对称的,所以我们一开始选择比较的节点很重要,需要选择左节点的左子树&&右节点的右子树,还有左节点的右子树&&右节点的左子树,这样子去完成每一次的递归。
cpp
class Solution {
public:
bool compare(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 out = compare(left->left, right->right);
bool in = compare(left->right, right->left);
bool ans = out && in;
return ans;
}
bool isSymmetric(TreeNode* root) {
if (root == NULL) return true;
return compare(root->left, root->right);;
}
};
对于迭代的话,我用队列去实现。一开始先把根节点的左右节点压进来,之后依次出队,如果说两边都空那对称直接继续;如果说如果说只有单边或者两边不相等,那么就false。之后再按左节点的左子树->右节点的右子树->左节点的右子树->右节点的左子树的顺序来入队,如果while循环能出来的直接true没问题。
cpp
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if (root == NULL) return true;
queue<TreeNode*> que;
que.push(root->left);
que.push(root->right);
while (!que.empty()) {
TreeNode* leftnode = que.front();
que.pop();
TreeNode* rightnode = que.front();
que.pop();
if (!leftnode && !rightnode) {
continue;
}
if ((!leftnode || !rightnode || (leftnode->val != rightnode->val))) {
return false;
}
que.push(leftnode->left);
que.push(rightnode->right);
que.push(leftnode->right);
que.push(rightnode->left);
}
return true;
}
};