今日任务
513. 找树左下角的值
- 题目链接: https://leetcode.cn/problems/find-bottom-left-tree-value/description/
- 题目描述:

Code 多种方法
class Solution {
public:
// int ans;
// int len = -1;
// void dfs(TreeNode *node, int depth){
// if(node == nullptr){
// return;
// }
// if(len == depth){
// len++;
// ans = node->val;
// }
// if(node->left){
// dfs(node->left, depth + 1);
// }
// if(node->right){
// dfs(node->right, depth + 1);
// }
// }
// void dfs(TreeNode *node, int depth){
// if(node->left == node->right){
// if(depth > len){
// len = depth;
// ans = node->val;
// }
// return;
// }
// if(node->left){
// dfs(node->left, depth + 1);
// }
// if(node->right){
// dfs(node->right, depth + 1);
// }
// return;
// }
public:
int findBottomLeftValue(TreeNode* root) {
// DFS
// function<void(TreeNode *, int)> dfs = [&] (auto node, auto depth) -> void{
// if(node == nullptr){
// return;
// }
// if(len == depth){
// len++;
// ans = node->val;
// }
// if(node->left){
// dfs(node->left, depth + 1);
// }
// if(node->right){
// dfs(node->right, depth + 1);
// }
// };
dfs(root, 0);
return ans;
// BFS
TreeNode *node = nullptr;
queue<TreeNode *> que;
que.emplace(root);
while(!que.empty()){
node = que.front();
que.pop();
if(node->right){
que.emplace(node->right);
}
if(node->left){
que.emplace(node->left);
}
}
return node->val;
}
};
112 113. 路径总和
- 题目链接: https://leetcode.cn/problems/path-sum/description/
- 题目描述:


Code 112 递归 + 迭代
class Solution {
public:
bool hasPathSum(TreeNode* root, int targetSum) {
// if(root == nullptr){
// return false;
// }
// bool ans = false;
// function<void(TreeNode *, int)> dfs = [&](auto node, auto sum)->void{
// if(node->left == node->right){
// if(sum + node->val == targetSum){
// ans = true;
// }
// return ;
// }
// if(ans){
// return;
// }
// if(node->left){
// dfs(node->left, sum + node->val);
// }
// if(node->right){
// dfs(node->right, sum + node->val);
// }
// };
// dfs(root, 0);
// return ans;
// DFS 简写
// if(root == nullptr){
// return false;
// }
// if(root->left == root->right){
// return targetSum == root->val;
// }
// // 左右子树有一个成立,则整体成立
// return hasPathSum(root->left, targetSum - root->val) || hasPathSum(root->right, targetSum - root->val);
// 迭代法
// if(root == nullptr){
// return false;
// }
// stack<pair<bool, TreeNode*>> st;
// st.emplace(make_pair(true, root));
// int sum = 0;
// while(!st.empty()){
// auto [flag, cur] = st.top();
// st.pop();
// if(flag){
// sum += cur->val;
// st.emplace(make_pair(false, cur));
// if(cur->right){
// st.emplace(make_pair(true, cur->right));
// }
// if(cur->left){
// st.emplace(make_pair(true, cur->left));
// }
// }else{
// if(cur->left == cur->right){
// if(sum == targetSum){
// return true;
// }
// }
// sum -= cur->val;
// }
// cout << sum << endl;
// }
// return false;
// 迭代2
if(root == nullptr){
return false;
}
stack<pair<TreeNode *, int>> st;
st.emplace(make_pair(root, root->val));
while(!st.empty()){
auto[cur, sum] = st.top();
st.pop();
if(cur->left == cur->right){
if(sum == targetSum){
return true;
}
}
if(cur->right){
st.emplace(make_pair(cur->right, sum + cur->right->val));
}
if(cur->left){
st.emplace(make_pair(cur->left, sum + cur->left->val));
}
}
return false;
// 迭代3 nullptr模版 + stack<TreeNode *, int>
// if(root == nullptr){
// return false;
// }
// stack<pair<TreeNode *, int>> st;
// st.emplace(make_pair(root, root->val));
// while(!st.empty()){
// auto [cur, sum] = st.top();
// st.pop();
// if(cur){
// if(cur->right){
// st.emplace(make_pair(cur->right, sum + cur->right->val));
// }
// if(cur->left){
// st.emplace(make_pair(cur->left, sum + cur->left->val));
// }
// st.emplace(make_pair(cur, sum));
// st.emplace(make_pair(nullptr, -1));
// }else{
// auto [tmp, cnt] = st.top();
// st.pop();
// if(tmp->left == tmp->right && cnt == targetSum){
// return true;
// }
// }
// }
// return false;
}
};
Code 113
class Solution {
public:
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
if(root == nullptr){
return {};
}
// vector<vector<int>> ans;
// vector<int> path;
// function<void(TreeNode *, int)> dfs = [&](auto node, auto sum)->void{
// if(node == nullptr){
// return;
// }
// path.emplace_back(node->val);
// if(node->left == node->right && sum == node->val){
// ans.emplace_back(path);
// path.pop_back();
// return;
// }
// dfs(node->left, sum - node->val);
// dfs(node->right, sum - node->val);
// path.pop_back();
// };
// dfs(root, targetSum);
// return ans;
// 迭代
vector<vector<int>> ans;
stack<pair<TreeNode *, int>> st;
st.emplace(make_pair(root, root->val));
vector<int> path;
while(!st.empty()){
auto[cur, sum] = st.top();
st.pop();
if(cur){
path.emplace_back(cur->val);
st.emplace(make_pair(cur, sum));
st.emplace(make_pair(nullptr, -1));
if(cur->right){
st.emplace(make_pair(cur->right, sum + cur->right->val));
}
if(cur->left){
st.emplace(make_pair(cur->left, sum + cur->left->val));
}
}else{
auto [tmp, cnt] = st.top();
st.pop();
if(tmp->left == tmp->right && cnt == targetSum){
ans.emplace_back(path);
}
path.pop_back();
}
}
return ans;
}
};
106. 从中序与后序遍历序列构造二叉树
- 题目链接: https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal/description/
- 题目描述:

Code
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(postorder.empty()){
return nullptr;
}
int left_size = ranges::find(inorder, postorder.back()) - inorder.begin();
vector<int> in1(inorder.begin(), inorder.begin() + left_size);
vector<int> in2(inorder.begin() + left_size + 1, inorder.end());
vector<int> post1(postorder.begin(), postorder.begin() + left_size);
vector<int> post2(postorder.begin() + left_size, postorder.end() - 1);
TreeNode *left = buildTree(in1, post1);
TreeNode *right = buildTree(in2, post2);
return new TreeNode(postorder.back(), left, right);
}
};
1492

被折叠的 条评论
为什么被折叠?



