学习目标:
- 513.找树左下角的值
- 112. 路径总和
- 113.路径总和ii
- 106.从中序与后序遍历序列构造二叉树
- 105.从前序与中序遍历序列构造二叉树
学习内容:
513. 找树左下角的值
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int maxdepth = INT_MIN;
int result;// 注意了,这两个是全局变量。
void traversal(TreeNode* cur, int depth){
if(cur->left ==nullptr && cur->right == nullptr)
{
if(depth>maxdepth) {
maxdepth = depth;
result = cur->val;
}
return;
}
//左边
if(cur->left){
depth++;
traversal(cur->left,depth);
depth--; // 回溯和递归是紧紧相连的,递归结束后回溯上一个深度,才能顺利到右边去递归。
}
//右边
if(cur->right){
depth++;
traversal(cur->right,depth);
depth--;
}
}
int findBottomLeftValue(TreeNode* root) {
traversal(root,0);
return result;
}
};
错误以及注意事项
- 怎么找二叉树的左下角? 递归中又带回溯了,怎么办?
112. 路径总和
class Solution {
public:
bool traversal(TreeNode* cur, int count){
//终止条件
if(cur->left==nullptr&& cur->right==nullptr&& count==0)
{
return true;
}
if(cur->left==nullptr&& cur->right==nullptr)
{
// 遇到叶子节点而没有找到合适的边,直接返回
return false;
}
if(cur->left){
count-=cur->val;
if(traversal(cur->left,count)==true) return true;
count+=cur->val;
}
if(cur->right){
count-=cur->val;
if(traversal(cur->right,count)==true) return true; //这样可以保证一旦找到就立马返回,不会浪费时间
count+=cur->val;
}
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==nullptr) return false;
return traversal(root,targetSum-root->val);
}
};
错误以及注意事项
- 注意看终止条件的count是剩下的路径需要的总和值,这也就是说主函数里传进去的参数应该是减去了root的value的。
113.路径总和ii
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void traversal(TreeNode* cur, int count)
{
if(cur->left==nullptr&& cur->right==nullptr&& count==0)
{
result.push_back(path);
return;
}
if(cur->left==nullptr&& cur->right==nullptr)
return;//到了叶子结点但是不符合条件,直接返回。
if(cur->left) // 处理的左边的结点,那么删除的数值/增加的路径值就都是左边的结点。
{
path.push_back(cur->left->val);
count -= cur->left->val;
traversal(cur->left,count);
count+=cur->left->val;
path.pop_back();
}
if(cur->right){
path.push_back(cur->right->val);
count-=cur->right->val;
traversal(cur->right,count);
count+=cur->right->val;
path.pop_back();
}
return;
}
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
if(root==nullptr) return result;
path.push_back(root->val);
traversal(root, targetSum-root->val);
return result;
}
};
106.从中序与后序遍历序列构造二叉树
105.从前序与中序遍历序列构造二叉树
学习时间:
2023.12.17 20:00-21:57
没学完哩。
2023.12.18 20:00-21:30
困死了思考不下去了