513. 找树左下角的值
class Solution {
public:
int findBottomLeftValue(TreeNode* root) {
queue<TreeNode*> q;
q.push(root);
int res;
while(!q.empty()){
int n=q.size();
for(int i=0;i<n;i++){
auto node=q.front();
q.pop();
if(node->left)
q.push(node->left);
if(node->right)
q.push(node->right);
if(i==0)
res=node->val;
}
}
return res;
}
};
112. 路径总和
class Solution {
public:
bool hasPathSum(TreeNode* root, int targetSum) {
if(root==nullptr)
return false;
if(root->left==nullptr&&root->right==nullptr&&root->val==targetSum)
return true;
return hasPathSum(root->left,targetSum-root->val)||hasPathSum(root->right,targetSum-root->val);
}
};
113. 路径总和 II
class Solution {
public:
vector<vector<int>> res;
vector<int> temp;
int sum;
void dfs(TreeNode* root, int targetSum){
if(root->left==nullptr&&root->right==nullptr){
if(sum+root->val==targetSum){
vector<int> ans(temp.begin(),temp.end());
ans.push_back(root->val);
res.push_back(ans);
}
return;
}
sum+=root->val;
temp.push_back(root->val);
if(root->left)
dfs(root->left,targetSum);
if(root->right)
dfs(root->right,targetSum);
temp.pop_back();
sum-=root->val;
}
vector<vector<int>> pathSum(TreeNode* root, int targetSum) {
if(root==nullptr)
return {};
dfs(root,targetSum);
return res;
}
};
终止条件中避免对temp的操作,影响回溯,所以额外拷贝了一个ans变量。
106. 从中序与后序遍历序列构造二叉树
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
if(inorder.empty())
return nullptr;
TreeNode *root;
for(int i=0;i<inorder.size();i++){
if(inorder[i]==postorder.back()){
root=new TreeNode(postorder.back());
vector<int> in_left(inorder.begin(),inorder.begin()+i);
vector<int> in_right(inorder.begin()+i+1,inorder.end());
vector<int> post_left(postorder.begin(),postorder.begin()+i);
vector<int> post_right(postorder.begin()+i,postorder.end()-1);
root->left=buildTree(in_left,post_left);
root->right=buildTree(in_right,post_right);
}
}
return root;
}
};
105. 从前序与中序遍历序列构造二叉树
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.empty())
return nullptr;
TreeNode* root=new TreeNode(preorder[0]);
for(int i=0; i<inorder.size(); i++){
if(inorder[i]==preorder[0]){
vector<int> in_left(inorder.begin(),inorder.begin()+i);
vector<int> in_right(inorder.begin()+i+1,inorder.end());
vector<int> pre_left(preorder.begin()+1,preorder.begin()+1+i);
vector<int> pre_right(preorder.begin()+1+i,preorder.end());
root->left=buildTree(pre_left,in_left);
root->right=buildTree(pre_right,in_right);
}
}
return root;
}
};