110.平衡二叉树
重点:
平衡二叉树的概念:所以左子树与右子树的高度差不大于1
使用后序遍历:手机子树的高度,上交给父节点,来计算
代码实现
class Solution {
public:
int getHeight(TreeNode* node) {
//退出条件,如果当前树是空,树的高度也就是0
if(node == nullptr) return 0;
//当前层的处理逻辑 分别获取左右子树是不是平衡二叉树,如果有一个不是返回-1
int left_height = getHeight(node->left);
if(left_height == -1) return -1;//此时可以提前退出
int right_height = getHeight(node->right);
if(right_height == -1) return -1;
//如果左右子树的差的绝对值大于1 ,说明不是平衡二叉树
if(abs(right_height - left_height) > 1) {
return -1;
}
return 1 + max(right_height, left_height);
}
bool isBalanced(TreeNode* root) {
return getHeight(root) == -1 ? false : true;
}
};
257. 二叉树的所有路径
题目链接/文章讲解/视频讲解决
重点:回溯,层层回溯
class Solution {
private:
void traversal(TreeNode* cur, vector<int>& path, vector<string>& result) {
path.push_back(cur->val); // 中,中为什么写在这里,因为最后一个节点也要加入到path中
// 这才到了叶子节点
if (cur->left == NULL && cur->right == NULL) {
string sPath;
for (int i = 0; i < path.size() - 1; i++) {
sPath += to_string(path[i]);
sPath += "->";
}
sPath += to_string(path[path.size() - 1]);
result.push_back(sPath);
return;
}
if (cur->left) { // 左
traversal(cur->left, path, result);
path.pop_back(); // 回溯
}
if (cur->right) { // 右
traversal(cur->right, path, result);
path.pop_back(); // 回溯
}
}
public:
vector<string> binaryTreePaths(TreeNode* root) {
vector<string> result;
vector<int> path;
if (root == NULL) return result;
traversal(root, path, result);
return result;
}
};
这是大家第一次接触到回溯的过程, 我在视频里重点讲解了 本题为什么要有回溯,已经回溯的过程。
404.左叶子之和
重点:
左叶子的概念:本身是左节点,并且是叶子节点
访问的层数:访问到叶子节点的上一个节点才能判断是不是左叶子
代码实现
class Solution {
public:
int sumOfLeftLeaves(TreeNode* root) {
if(root == nullptr) return 0;
//当前节点的左右节点都为空,就可以提前退出了
if(root->left == nullptr && root->right == nullptr) return 0;
int sum_left = 0;
//左节点存在并且他的左右节点都为空说明是左叶子,如果是叶子节点,sum就是叶子节点的值
//如果当前节点的左节点是叶子节点 就收集左叶子的值,如果不是叶子节点再进行递归
if(root->left != nullptr && root->left->left == nullptr && root->left->right == nullptr) {
sum_left = root->left->val;
} else {
sum_left = sumOfLeftLeaves(root->left);
}
int sum_right = sumOfLeftLeaves(root->right);
return sum_left + sum_right;
}
};