513.找树左下角的值
思路:层序遍历,最后一层的第一个叶子节点
class Solution {
public:
int findBottomLeftValue(TreeNode* root) {
queue<TreeNode*> que;
if(root) que.push(root);
int result = root->val;
while(!que.empty()){
TreeNode* node = que.front();
que.pop();
result = node->val;
if(node->right) que.push(node->right);
if(node->left) que.push(node->left);
}
return result;
}
};
参考文章:代码随想录-513.找树左下角的值
112. 路径总和
思路:先序遍历,记录每一条到达叶子节点的路劲之和并判断结果
class Solution {
public:
bool traversal(TreeNode* node, int sum, int targetSum){
sum += node->val;
if(!node->left && !node->right && sum==targetSum){
return true;
}
if(node->left){
if(traversal(node->left, sum, targetSum)){
return true;
}
}
if(node->right){
if(traversal(node->right, sum, targetSum)){
return true;
}
}
return false;
}
bool hasPathSum(TreeNode* root, int targetSum) {
int sum = 0;
if(!root) return false;
return traversal(root, sum, targetSum);
}
};
参考文章:代码随想录-112. 路径总和
106.从中序与后序遍历序列构造二叉树
题目链接:106.从中序与后序遍历序列构造二叉树-力扣(LeetCode)
思路:很经典的做法,递归逐次划分左右子树,关键要细致,确认划分区间的逻辑
class Solution {
int post_idx;
unordered_map<int, int> idx_map;
public:
TreeNode* build(vector<int>& inorder, vector<int>& postorder, int left, int right){
if(right<left) return nullptr;
TreeNode* node = new TreeNode(postorder[post_idx]);
int idx = idx_map[postorder[post_idx]];
post_idx--;
node->right = build(inorder, postorder, idx+1, right);
node->left = build(inorder, postorder, left, idx-1);
return node;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
post_idx = postorder.size()-1;
for(int i = 0; i<inorder.size(); i++){
idx_map[inorder[i]] = i;
}
return build(inorder, postorder, 0, inorder.size()-1);
}
};