今天是二叉树
AC代码:
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (root == nullptr)
return nullptr;
TreeNode* node = root->left;
root->left = root->right;
root->right = node;
invertTree(root->left);
invertTree(root->right);
return root;
}
};
2. 101. 对称二叉树
这道题关键的点在于我们要判断左右子树是否是对称的,也就是说我们要比较的是两个树,因此,我们要同时比较左和右,如果它们都不为空切值相等,那么我们再判断左边的与右边的右边是否相等,以及左边的右边与右边的左边是否相等
AC代码:
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(root == nullptr) return true;
return compare(root->left, root->right);
}
bool compare(TreeNode* left, TreeNode* right)
{
if(left == nullptr && right == nullptr) return true;
else if(left != nullptr && right == nullptr) return false;
else if(left == nullptr && right != nullptr) return false;
else if(left->val != right->val) return false;
bool isLeftSame = compare(left->left, right->right);
bool isRightSame = compare(left->right, right->left);
return isLeftSame && isRightSame;
}
};
层序遍历
AC代码:
class Solution {
public:
int maxDepth(TreeNode* root) {
if (root == nullptr) return 0;
queue<TreeNode*> nodes;
int depth = 0;
nodes.push(root);
TreeNode* node = nullptr;
while (!nodes.empty()) {
int size = nodes.size();
for (int i = 0; i < size; ++i) {
node = nodes.front();
nodes.pop();
if (node->left != nullptr) nodes.push(node->left);
if (node->right != nullptr) nodes.push(node->right);
}
depth++;
}
return depth;
}
};
和最大深度类似,变化的点在于每次弹出节点时判断一下是否是叶子节点,如果是,就中断搜索
class Solution {
public:
int minDepth(TreeNode* root) {
if (root == nullptr) return 0;
queue<TreeNode*> nodes;
int depth = 0;
nodes.push(root);
TreeNode* node = nullptr;
while (!nodes.empty()) {
int size = nodes.size();
depth++;
bool found = false;
for (int i = 0; i < size; ++i) {
node = nodes.front();
nodes.pop();
if(node->left == nullptr && node->right == nullptr){
found = true;
break;
}
if (node->left != nullptr) nodes.push(node->left);
if (node->right != nullptr) nodes.push(node->right);
}
if(found) break;
}
return depth;
}
};