**找树左下角的值 **
层序遍历比较好做,做这题很合适
class Solution {
public:
int findBottomLeftValue(TreeNode* root) {
// 层序遍历
queue<TreeNode*> que;
if (root != nullptr) que.push(root);
int result;
while (!que.empty()) {
int size = que.size();
for (int i = 0; i < size; i++) {
TreeNode* node = que.front();
que.pop();
if (i == 0)
result = node->val;
if (node->left) que.push(node->left);
if (node->right) que.push(node->right);
}
}
return result;
}
};
本地递归偏难,反而迭代简单属于模板题, 两种方法掌握一下
题目链接/文章讲解/视频讲解:https://programmercarl.com/0513.%E6%89%BE%E6%A0%91%E5%B7%A6%E4%B8%8B%E8%A7%92%E7%9A%84%E5%80%BC.html
**路径总和 **
既然能求出所有路径了,那直接把所有路径的值求和然后和目标值匹配就行
只需要在257题目上修改一小部分代码就能ac后两道题,直接把这三个题当模板题做。
但还是多积累一些思路,学习一下另一种写法
class Solution {
public:
void trival(TreeNode* node, vector<int>& path, vector<vector<int>>& result,
int targetSum) {
path.push_back(node->val);
if (!node->left && !node->right) {
int sum = accumulate(path.begin(), path.end(), 0);
if (sum == targetSum) {
result.push_back(path);
}
return;
}
if (node->left) {
trival(node->left, path, result, targetSum);
path.pop_back();
}
if (node->right) {
trival(node->right, path, result, targetSum);
path.pop_back();
}
}
bool hasPathSum(TreeNode* root, int targetSum) {
if (root == NULL)
return false;
vector<int> path;
vector<vector<int>> result;
trival(root, path, result, targetSum);
// 112路径总和
if (result.empty()) {
return false;
} else {
return true;
}
// 113路径总和2,直接返回就行
// return result;
}
};
本题 又一次设计要回溯的过程,而且回溯的过程隐藏的还挺深,建议先看视频来理解
112. 路径总和,和 113. 路径总和ii 一起做了。 优先掌握递归法。
题目链接/文章讲解/视频讲解:https://programmercarl.com/0112.%E8%B7%AF%E5%BE%84%E6%80%BB%E5%92%8C.html
**从中序与后序遍历序列构造二叉树 **
这题还得再看看循环不变量,看看区间端点的值
class Solution {
public:
TreeNode* traversal(vector<int>& inorder, vector<int>& postorder) {
if (postorder.size() == 0) return nullptr;
// 后序遍历数组最后一个元素,就是当前的中间节点
int rootValue = postorder[postorder.size() - 1];
TreeNode* root = new TreeNode(rootValue);
// 叶子节点
if (postorder.size() == 1) return root;
// 找到中序遍历的切割点
int delimiterIndex;
for (delimiterIndex = 0; delimiterIndex < inorder.size(); delimiterIndex++) {
if(inorder[delimiterIndex] == rootValue) break;
}
// 切割中序数组
// 左闭右开区间
vector<int> leftInorder(inorder.begin(), inorder.begin() + delimiterIndex);
vector<int> rightInorder(inorder.begin() + delimiterIndex + 1, inorder.end());
// 舍弃末尾元素
postorder.resize(postorder.size() - 1);
// 切割后序数组
// 依然左闭右开,注意使用了左中序数组大小作为切割点
// [0, leftInorder.size())
vector<int> leftPostorder(postorder.begin(), postorder.begin() + leftInorder.size());
// [leftInorder.size(), end)
vector<int> rightPostorder(postorder.begin() + leftInorder.size(), postorder.end());
root->left = traversal(leftInorder, leftPostorder);
root->right = traversal(rightInorder, rightPostorder);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return traversal(inorder, postorder);
}
};
本题算是比较难的二叉树题目了,大家先看视频来理解。
106.从中序与后序遍历序列构造二叉树,105.从前序与中序遍历序列构造二叉树 一起做,思路一样的
题目链接/文章讲解/视频讲解:https://programmercarl.com/0106.%E4%BB%8E%E4%B8%AD%E5%BA%8F%E4%B8%8E%E5%90%8E%E5%BA%8F%E9%81%8D%E5%8E%86%E5%BA%8F%E5%88%97%E6%9E%84%E9%80%A0%E4%BA%8C%E5%8F%89%E6%A0%91.html