小扣有一个根结点为 root
的二叉树模型,初始所有结点均为白色,可以用蓝色染料给模型结点染色,模型的每个结点有一个 val
价值。小扣出于美观考虑,希望最后二叉树上每个蓝色相连部分的结点个数不能超过 k
个,求所有染成蓝色的结点价值总和最大是多少?
示例 1:
输入:
root = [5,2,3,4], k = 2
输出:
12
示例 2:
输入:
root = [4,1,3,9,null,null,2], k = 2
输出:
16
提示:
1 <= k <= 10
1 <= val <= 10000
1 <= 结点数量 <= 10000
我们考虑以
如果我们不染色
如果我们染色
最后答案就是
时间复杂度
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def maxValue(self, root: TreeNode, k: int) -> int:
def dfs(root: TreeNode) -> List[int]:
ans = [0] * (k + 1)
if root is None:
return ans
l, r = dfs(root.left), dfs(root.right)
ans[0] = max(l) + max(r)
for i in range(k):
for j in range(k - i):
ans[i + j + 1] = max(ans[i + j + 1], l[i] + r[j] + root.val)
return ans
return max(dfs(root))
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private int k;
public int maxValue(TreeNode root, int k) {
this.k = k;
return Arrays.stream(dfs(root)).max().getAsInt();
}
private int[] dfs(TreeNode root) {
int[] ans = new int[k + 1];
if (root == null) {
return ans;
}
int[] l = dfs(root.left);
int[] r = dfs(root.right);
ans[0] = Arrays.stream(l).max().getAsInt() + Arrays.stream(r).max().getAsInt();
for (int i = 0; i < k; ++i) {
for (int j = 0; j < k - i; ++j) {
ans[i + j + 1] = Math.max(ans[i + j + 1], root.val + l[i] + r[j]);
}
}
return ans;
}
}
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int maxValue(TreeNode* root, int k) {
function<vector<int>(TreeNode*)> dfs = [&](TreeNode* root) -> vector<int> {
vector<int> ans(k + 1);
if (!root) {
return ans;
}
vector<int> l = dfs(root->left);
vector<int> r = dfs(root->right);
ans[0] = *max_element(l.begin(), l.end()) + *max_element(r.begin(), r.end());
for (int i = 0; i < k; ++i) {
for (int j = 0; j < k - i; ++j) {
ans[i + j + 1] = max(ans[i + j + 1], l[i] + r[j] + root->val);
}
}
return ans;
};
vector<int> ans = dfs(root);
return *max_element(ans.begin(), ans.end());
}
};
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func maxValue(root *TreeNode, k int) int {
var dfs func(*TreeNode) []int
dfs = func(node *TreeNode) []int {
ans := make([]int, k+1)
if node == nil {
return ans
}
l := dfs(node.Left)
r := dfs(node.Right)
ans[0] = slices.Max(l) + slices.Max(r)
for i := 0; i < k; i++ {
for j := 0; j < k-i; j++ {
ans[i+j+1] = max(ans[i+j+1], l[i]+r[j]+node.Val)
}
}
return ans
}
return slices.Max(dfs(root))
}
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* @param {TreeNode} root
* @param {number} k
* @return {number}
*/
var maxValue = function (root, k) {
const dfs = root => {
const ans = Array(k + 1).fill(0);
if (!root) {
return ans;
}
const l = dfs(root.left);
const r = dfs(root.right);
ans[0] = Math.max(...l) + Math.max(...r);
for (let i = 0; i < k; i++) {
for (let j = 0; j < k - i; ++j) {
ans[i + j + 1] = Math.max(ans[i + j + 1], l[i] + r[j] + root.val);
}
}
return ans;
};
return Math.max(...dfs(root));
};