今天的题目不算难,主要都是用递归来做的,感觉递归在二叉树里真是运用的淋漓尽致。
226.翻转二叉树
这个没看讲解,直接用递归做的,挺简单。
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
TreeNode* result = root;
change(result);
return result;
}
void change(TreeNode* &root){
if(root == NULL)
return ;
if(root -> left || root -> right){
TreeNode* temp = root -> left;
root -> left = root -> right;
root -> right = temp;
}
change(root -> left);
change(root -> right);
}
};
101. 对称二叉树
这个确实不太会,直接看视频的,对于每一层的节点,都需要比较其外侧节点和内侧节点,这个很关键。
class Solution {
public:
bool isSymmetric(TreeNode* root) {
return Compare(root -> left, root -> right);
}
bool Compare(TreeNode* left, TreeNode* right){
if(left == NULL && right != NULL) return false;
else if(right == NULL && left != NULL) return false;
else if(right == NULL && left == NULL) return true;
else if(left -> val != right -> val) return false;
bool outside = Compare(left -> left, right -> right);
bool inside = Compare(left -> right, right -> left);
return outside && inside;
}
};
104.二叉树的最大深度
这个前一天已经做过了,当时我是用层序遍历来做的,看完讲解以后感觉递归确实更加简洁有效,递归yyds!
class Solution {
public:
int maxDepth(TreeNode* root) {
if(root == NULL) return 0;
int left = maxDepth(root -> left); //左子树最大高度
int right = maxDepth(root -> right); //右子树最大高度
return 1 + max(left, right);
}
};
111.二叉树的最小深度
这个前一天的任务里也有,当时也是用层序遍历来做的,看完递归以后就不想用层序遍历了。递归确实是太好用了。
class Solution {
public:
int minDepth(TreeNode* root) {
if(root == NULL) return 0;
int left = minDepth(root -> left);
int right = minDepth(root -> right);
if(left == 0 && right != 0) return 1 + right;
if(right == 0 && left != 0) return 1 + left;
return 1 + min(left, right);
}
};
下播。