反转二叉树 LeetCode 226
1)递归法
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == nullptr) {
return nullptr;
}
TreeNode* left = invertTree(root->left);
TreeNode* right = invertTree(root->right);
root->left = right;
root->right = left;
return root;
}
};
2)迭代法
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root == nullptr) {
return nullptr;
}
queue<TreeNode*> que;
que.push(root);
TreeNode* cur;
while (!que.empty()) {
cur = que.front();
que.pop();
//层次遍历的目的就是swap每个节点的左右孩子
swap(cur->left, cur->right);
if (cur->right) {
que.push(cur->right);
}
if (cur->left) {
que.push(cur->left);
}
}
return root;
}
};
对称二叉树 LeetCode 101
1)递归法
class Solution {
public:
bool isSymmetric(TreeNode* root) {
return comparator(root->left, root->right);
}
bool comparator(TreeNode* left, TreeNode* right) {
if(left == nullptr && right != nullptr) {
return false;
} else if(left != nullptr && right == nullptr) {
return false;
} else if (left == nullptr && right == nullptr){
return true;
} else if(left->val != right->val) {
return false;
}
bool outCompare = comparator(left->left, right->right);
bool inCompare = comparator(left->right, right->left);
return outCompare && inCompare;
}
};
2)迭代法(队列)
class Solution {
public:
bool isSymmetric(TreeNode* root) {
queue<TreeNode*> que;
if (!root) {
return true;
}
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 == nullptr && rightNode != nullptr) || (rightNode == nullptr && leftNode != nullptr) || (rightNode->val != leftNode->val)) {
return false;
}
que.push(leftNode->left);
que.push(rightNode->right);
que.push(leftNode->right);
que.push(rightNode->left);
}
return true;
}
};