50)向下的路径节点之和
class Solution{
public:
int pathSum(TreeNode* root, int targetSum){
if(!root) return 0;
int ret = rootSum(root, targetSum);
ret += pathSum(root->left, targetSum);
ret += pathSum(root->right, targetSum);
return ret;
}
int rootSum(TreeNode* root, int sum){
if(!root) return 0;
int ret = 0;
if(sum==root->val) ret++;
ret += rootSum(root->left, sum-root->val);
ret += rootSum(root->right, sum-root->val);
return ret;
}
};
51)节点之和最大的路径
class Solution{
private:
int ret;
int dfs(TreeNode* root){
if(!root) return 0;
int left = max(0, dfs(root->left));
int right = max(0, dfs(root->right));
ret = max(ret, left+right+root->val);
return root->val + max(left, right);
}
public:
int maxPathSum(TreeNode* root){
ret = INT_MIN;
dfs(root);
return ret;
}
};
52)展平二叉搜索树
class Solution {
public:
void inorder(TreeNode* root, vector<int>& res){
if(!root) return;
inorder(root->left, res);
res.push_back(root->val);
inorder(root->right, res);
}
TreeNode* increasingBST(TreeNode* root) {
vector<int> res;
inorder(root, res);
TreeNode* dummynode = new TreeNode(-1);
TreeNode* curnode = dummynode;
for(int item : res){
curnode->right = new TreeNode(item);
curnode = curnode->right;
}
return dummynode->right;
}
};