33
33
34
34
<!-- 这里可写通用的实现逻辑 -->
35
35
36
+ ** 方法一:动态规划(树形 DP)**
37
+
38
+ 我们考虑以 $root$ 为根节点的子树,且 $root$ 节点连着 $t$ 个染色节点的最大价值,其中 $t \in [ 0, k] $。我们用状态 $f[ root] [ t ] $ 来表示。
39
+
40
+ 如果我们不染色 $root$ 节点,那么 $root$ 的左右节点可以连着 $t \in [ 0, k] $ 个染色节点,即 $f[ root] [ 0 ] = \max_ {t \in [ 0, k] } f[ root.left] [ t ] + \max_ {t \in [ 0, k] } f[ root.right] [ t ] $。
41
+
42
+ 如果我们染色 $root$ 节点,那么 $root$ 的左右节点可以连着最多共 $k-1$ 个染色节点,不妨假设左节点连着 $i$ 个染色节点,右节点连着 $j$ 个染色节点,其中 $i \in [ 0, k-1] $, $j \in [ 0, k-1-i] $,那么 $f[ root] [ i + j + 1 ] = \max_ {i \in [ 0, k-1] , j \in [ 0, k-1-i] } f[ root.left] [ i ] + f[ root.right] [ j ] + root.val$。
43
+
44
+ 最后答案就是 $f[ root] [ t ] $ 中的最大值。
45
+
46
+ 时间复杂度 $O(n \times k^2)$,空间复杂度 $O(n \times k)$。其中 $n$ 和 $k$ 分别是二叉树的节点数和 $k$ 的值。
47
+
36
48
<!-- tabs:start -->
37
49
38
50
### ** Python3**
50
62
51
63
class Solution :
52
64
def maxValue (self , root : TreeNode, k : int ) -> int :
53
- def dfs (root ) :
65
+ def dfs (root : TreeNode) -> List[ int ] :
54
66
ans = [0 ] * (k + 1 )
55
67
if root is None :
56
68
return ans
57
69
l, r = dfs(root.left), dfs(root.right)
70
+ ans[0 ] = max (l) + max (r)
58
71
for i in range (k):
59
72
for j in range (k - i):
60
73
ans[i + j + 1 ] = max (ans[i + j + 1 ], l[i] + r[j] + root.val)
61
- for i in range (k + 1 ):
62
- for j in range (k + 1 ):
63
- ans[0 ] = max (ans[0 ], l[i] + r[j])
64
74
return ans
65
75
66
76
return max (dfs(root))
@@ -81,37 +91,147 @@ class Solution:
81
91
* }
82
92
*/
83
93
class Solution {
94
+ private int k;
95
+
84
96
public int maxValue (TreeNode root , int k ) {
85
- int [] t = dfs(root, k);
86
- int ans = 0 ;
87
- for (int v : t) {
88
- ans = Math . max(ans, v);
89
- }
90
- return ans;
97
+ this . k = k;
98
+ return Arrays . stream(dfs(root)). max(). getAsInt();
91
99
}
92
100
93
- private int [] dfs (TreeNode root , int k ) {
101
+ private int [] dfs (TreeNode root ) {
94
102
int [] ans = new int [k + 1 ];
95
103
if (root == null ) {
96
104
return ans;
97
105
}
98
- int [] l = dfs(root. left, k);
99
- int [] r = dfs(root. right, k);
106
+ int [] l = dfs(root. left);
107
+ int [] r = dfs(root. right);
108
+ ans[0 ] = Arrays . stream(l). max(). getAsInt() + Arrays . stream(r). max(). getAsInt();
100
109
for (int i = 0 ; i < k; ++ i) {
101
110
for (int j = 0 ; j < k - i; ++ j) {
102
- ans[i + j + 1 ] = Math . max(ans[i + j + 1 ], l[i] + r[j] + root. val);
103
- }
104
- }
105
- for (int i = 0 ; i <= k; ++ i) {
106
- for (int j = 0 ; j <= k; ++ j) {
107
- ans[0 ] = Math . max(ans[0 ], l[i] + r[j]);
111
+ ans[i + j + 1 ] = Math . max(ans[i + j + 1 ], root. val + l[i] + r[j]);
108
112
}
109
113
}
110
114
return ans;
111
115
}
112
116
}
113
117
```
114
118
119
+ ### ** C++**
120
+
121
+ ``` cpp
122
+ /* *
123
+ * Definition for a binary tree node.
124
+ * struct TreeNode {
125
+ * int val;
126
+ * TreeNode *left;
127
+ * TreeNode *right;
128
+ * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
129
+ * };
130
+ */
131
+ class Solution {
132
+ public:
133
+ int maxValue(TreeNode* root, int k) {
134
+ function<vector<int >(TreeNode* )> dfs = [ &] (TreeNode* root) -> vector<int > {
135
+ vector<int > ans(k + 1);
136
+ if (!root) {
137
+ return ans;
138
+ }
139
+ vector<int > l = dfs(root->left);
140
+ vector<int > r = dfs(root->right);
141
+ ans[ 0] = * max_element(l.begin(), l.end()) + * max_element(r.begin(), r.end());
142
+ for (int i = 0; i < k; ++i) {
143
+ for (int j = 0; j < k - i; ++j) {
144
+ ans[ i + j + 1] = max(ans[ i + j + 1] , l[ i] + r[ j] + root->val);
145
+ }
146
+ }
147
+ return ans;
148
+ };
149
+ vector<int > ans = dfs(root);
150
+ return * max_element(ans.begin(), ans.end());
151
+ }
152
+ };
153
+ ```
154
+
155
+ ### **Go**
156
+
157
+ ```go
158
+ /**
159
+ * Definition for a binary tree node.
160
+ * type TreeNode struct {
161
+ * Val int
162
+ * Left *TreeNode
163
+ * Right *TreeNode
164
+ * }
165
+ */
166
+ func maxValue(root *TreeNode, k int) int {
167
+ var dfs func(*TreeNode) []int
168
+ dfs = func(node *TreeNode) []int {
169
+ ans := make([]int, k+1)
170
+ if node == nil {
171
+ return ans
172
+ }
173
+ l := dfs(node.Left)
174
+ r := dfs(node.Right)
175
+ ans[0] = max(l...) + max(r...)
176
+ for i := 0; i < k; i++ {
177
+ for j := 0; j < k-i; j++ {
178
+ ans[i+j+1] = max(ans[i+j+1], l[i]+r[j]+node.Val)
179
+ }
180
+ }
181
+ return ans
182
+ }
183
+ return max(dfs(root)...)
184
+ }
185
+
186
+ func max(nums ...int) int {
187
+ ans := nums[0]
188
+ for _, x := range nums {
189
+ if x > ans {
190
+ ans = x
191
+ }
192
+ }
193
+ return ans
194
+ }
195
+ ```
196
+
197
+ ### ** JavaScript**
198
+
199
+ ``` js
200
+ /**
201
+ * Definition for a binary tree node.
202
+ * function TreeNode(val) {
203
+ * this.val = val;
204
+ * this.left = this.right = null;
205
+ * }
206
+ */
207
+ /**
208
+ * @param {TreeNode} root
209
+ * @param {number} k
210
+ * @return {number}
211
+ */
212
+ var maxValue = function (root , k ) {
213
+ const dfs = root => {
214
+ const ans = Array (k + 1 ).fill (0 );
215
+ if (! root) {
216
+ return ans;
217
+ }
218
+ const l = dfs (root .left );
219
+ const r = dfs (root .right );
220
+ ans[0 ] = Math .max (... l) + Math .max (... r);
221
+ for (let i = 0 ; i < k; i++ ) {
222
+ for (let j = 0 ; j < k - i; ++ j) {
223
+ ans[i + j + 1 ] = Math .max (
224
+ ans[i + j + 1 ],
225
+ l[i] + r[j] + root .val ,
226
+ );
227
+ }
228
+ }
229
+ return ans;
230
+ };
231
+ return Math .max (... dfs (root));
232
+ };
233
+ ```
234
+
115
235
### ** ...**
116
236
117
237
```
0 commit comments