Skip to content

Commit f116184

Browse files
committed
feat: add solutions to lc problem: No.0654
No.0654.Maximum Binary Tree
1 parent dbe98e5 commit f116184

File tree

2 files changed

+676
-0
lines changed

2 files changed

+676
-0
lines changed

solution/0600-0699/0654.Maximum Binary Tree/README.md

+341
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@
6262

6363
时间复杂度 $O(n^2)$,空间复杂度 $O(n)$,其中 $n$ 是数组的长度。
6464

65+
**方法二:线段树**
66+
67+
方法一中,每次查找区间最大值,需要 $O(n)$ 的时间,我们可以借助线段树,将每次查询区间最大值的时间降至 $O(logn)$。
68+
69+
最多需要查询 $n$ 次,因此,总的时间复杂度为 $O(nlogn)$,空间复杂度 $O(n)$,其中 $n$ 是数组的长度。
70+
6571
<!-- tabs:start -->
6672

6773
### **Python3**
@@ -90,6 +96,68 @@ class Solution:
9096
return dfs(nums)
9197
```
9298

99+
```python
100+
# Definition for a binary tree node.
101+
# class TreeNode:
102+
# def __init__(self, val=0, left=None, right=None):
103+
# self.val = val
104+
# self.left = left
105+
# self.right = right
106+
class Solution:
107+
def constructMaximumBinaryTree(self, nums: List[int]) -> Optional[TreeNode]:
108+
def dfs(l, r):
109+
if l > r:
110+
return None
111+
val = tree.query(1, l, r)
112+
root = TreeNode(val)
113+
root.left = dfs(l, d[val] - 1)
114+
root.right = dfs(d[val] + 1, r)
115+
return root
116+
117+
d = {v: i for i, v in enumerate(nums, 1)}
118+
tree = SegmentTree(nums)
119+
return dfs(1, len(nums))
120+
121+
122+
class Node:
123+
def __init__(self):
124+
self.l = 0
125+
self.r = 0
126+
self.v = 0
127+
128+
129+
class SegmentTree:
130+
def __init__(self, nums):
131+
self.nums = nums
132+
n = len(nums)
133+
self.tr = [Node() for _ in range(n << 2)]
134+
self.build(1, 1, n)
135+
136+
def build(self, u, l, r):
137+
self.tr[u].l, self.tr[u].r = l, r
138+
if l == r:
139+
self.tr[u].v = self.nums[l - 1]
140+
return
141+
mid = (l + r) >> 1
142+
self.build(u << 1, l, mid)
143+
self.build(u << 1 | 1, mid + 1, r)
144+
self.pushup(u)
145+
146+
def query(self, u, l, r):
147+
if self.tr[u].l >= l and self.tr[u].r <= r:
148+
return self.tr[u].v
149+
mid = (self.tr[u].l + self.tr[u].r) >> 1
150+
v = 0
151+
if l <= mid:
152+
v = max(v, self.query(u << 1, l, r))
153+
if r > mid:
154+
v = max(v, self.query(u << 1 | 1, l, r))
155+
return v
156+
157+
def pushup(self, u):
158+
self.tr[u].v = max(self.tr[u << 1].v, self.tr[u << 1 | 1].v)
159+
```
160+
93161
### **Java**
94162

95163
<!-- 这里可写当前语言的特殊实现逻辑 -->
@@ -136,6 +204,103 @@ class Solution {
136204
}
137205
```
138206

207+
```java
208+
/**
209+
* Definition for a binary tree node.
210+
* public class TreeNode {
211+
* int val;
212+
* TreeNode left;
213+
* TreeNode right;
214+
* TreeNode() {}
215+
* TreeNode(int val) { this.val = val; }
216+
* TreeNode(int val, TreeNode left, TreeNode right) {
217+
* this.val = val;
218+
* this.left = left;
219+
* this.right = right;
220+
* }
221+
* }
222+
*/
223+
class Solution {
224+
private SegmentTree tree;
225+
private int[] nums;
226+
private static int[] d = new int[1010];
227+
228+
public TreeNode constructMaximumBinaryTree(int[] nums) {
229+
int n = nums.length;
230+
this.nums = nums;
231+
tree = new SegmentTree(nums);
232+
for (int i = 0; i < n; ++i) {
233+
d[nums[i]] = i + 1;
234+
}
235+
return dfs(1, n);
236+
}
237+
238+
private TreeNode dfs(int l, int r) {
239+
if (l > r) {
240+
return null;
241+
}
242+
int val = tree.query(1, l, r);
243+
TreeNode root = new TreeNode(val);
244+
root.left = dfs(l, d[val] - 1);
245+
root.right = dfs(d[val] + 1, r);
246+
return root;
247+
}
248+
}
249+
250+
class Node {
251+
int l;
252+
int r;
253+
int v;
254+
}
255+
256+
class SegmentTree {
257+
Node[] tr;
258+
int[] nums;
259+
260+
public SegmentTree(int[] nums) {
261+
int n = nums.length;
262+
this.nums = nums;
263+
tr = new Node[n << 2];
264+
for (int i = 0; i < tr.length; ++i) {
265+
tr[i] = new Node();
266+
}
267+
build(1, 1, n);
268+
}
269+
270+
private void build(int u, int l, int r) {
271+
tr[u].l = l;
272+
tr[u].r = r;
273+
if (l == r) {
274+
tr[u].v = nums[l - 1];
275+
return;
276+
}
277+
int mid = (l + r) >> 1;
278+
build(u << 1, l, mid);
279+
build(u << 1 | 1, mid + 1, r);
280+
pushup(u);
281+
}
282+
283+
public int query(int u, int l, int r) {
284+
if (tr[u].l >= l && tr[u].r <= r) {
285+
return tr[u].v;
286+
}
287+
int mid = (tr[u].l + tr[u].r) >> 1;
288+
int v = 0;
289+
if (l <= mid) {
290+
v = query(u << 1, l, r);
291+
}
292+
if (r > mid) {
293+
v = Math.max(v, query(u << 1 | 1, l, r));
294+
}
295+
return v;
296+
}
297+
298+
private void pushup(int u) {
299+
tr[u].v = Math.max(tr[u << 1].v, tr[u << 1 | 1].v);
300+
}
301+
}
302+
```
303+
139304
### **C++**
140305

141306
```cpp
@@ -172,6 +337,91 @@ public:
172337
};
173338
```
174339

340+
```cpp
341+
/**
342+
* Definition for a binary tree node.
343+
* struct TreeNode {
344+
* int val;
345+
* TreeNode *left;
346+
* TreeNode *right;
347+
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
348+
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
349+
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
350+
* };
351+
*/
352+
class Node {
353+
public:
354+
int l, r, v;
355+
};
356+
357+
class SegmentTree {
358+
public:
359+
vector<Node*> tr;
360+
vector<int> nums;
361+
362+
SegmentTree(vector<int>& nums) {
363+
this->nums = nums;
364+
int n = nums.size();
365+
tr.resize(n << 2);
366+
for (int i = 0; i < tr.size(); ++i) tr[i] = new Node();
367+
build(1, 1, n);
368+
}
369+
370+
void build(int u, int l, int r) {
371+
tr[u]->l = l;
372+
tr[u]->r = r;
373+
if (l == r) {
374+
tr[u]->v = nums[l - 1];
375+
return;
376+
}
377+
int mid = (l + r) >> 1;
378+
build(u << 1, l, mid);
379+
build(u << 1 | 1, mid + 1, r);
380+
pushup(u);
381+
}
382+
383+
int query(int u, int l, int r) {
384+
if (tr[u]->l >= l && tr[u]->r <= r) return tr[u]->v;
385+
int mid = (tr[u]->l + tr[u]->r) >> 1;
386+
int v = 0;
387+
if (l <= mid) v = query(u << 1, l, r);
388+
if (r > mid) v = max(v, query(u << 1 | 1, l, r));
389+
return v;
390+
}
391+
392+
void pushup(int u) {
393+
tr[u]->v = max(tr[u << 1]->v, tr[u << 1 | 1]->v);
394+
}
395+
};
396+
397+
class Solution {
398+
public:
399+
SegmentTree* tree;
400+
vector<int> nums;
401+
vector<int> d;
402+
403+
TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
404+
tree = new SegmentTree(nums);
405+
this->nums = nums;
406+
d.assign(1010, 0);
407+
int n = nums.size();
408+
for (int i = 0; i < n; ++i) d[nums[i]] = i + 1;
409+
return dfs(1, nums.size());
410+
}
411+
412+
TreeNode* dfs(int l, int r) {
413+
if (l > r) {
414+
return nullptr;
415+
}
416+
int val = tree->query(1, l, r);
417+
TreeNode* root = new TreeNode(val);
418+
root->left = dfs(l, d[val] - 1);
419+
root->right = dfs(d[val] + 1, r);
420+
return root;
421+
}
422+
};
423+
```
424+
175425
### **Go**
176426
177427
```go
@@ -204,6 +454,97 @@ func constructMaximumBinaryTree(nums []int) *TreeNode {
204454
}
205455
```
206456

457+
```go
458+
/**
459+
* Definition for a binary tree node.
460+
* type TreeNode struct {
461+
* Val int
462+
* Left *TreeNode
463+
* Right *TreeNode
464+
* }
465+
*/
466+
func constructMaximumBinaryTree(nums []int) *TreeNode {
467+
d := make([]int, 1010)
468+
for i, v := range nums {
469+
d[v] = i + 1
470+
}
471+
tree := newSegmentTree(nums)
472+
var dfs func(l, r int) *TreeNode
473+
dfs = func(l, r int) *TreeNode {
474+
if l > r {
475+
return nil
476+
}
477+
val := tree.query(1, l, r)
478+
root := &TreeNode{Val: val}
479+
root.Left = dfs(l, d[val]-1)
480+
root.Right = dfs(d[val]+1, r)
481+
return root
482+
}
483+
484+
return dfs(1, len(nums))
485+
}
486+
487+
type node struct {
488+
l int
489+
r int
490+
v int
491+
}
492+
493+
type segmentTree struct {
494+
nums []int
495+
tr []*node
496+
}
497+
498+
func newSegmentTree(nums []int) *segmentTree {
499+
n := len(nums)
500+
tr := make([]*node, n<<2)
501+
for i := range tr {
502+
tr[i] = &node{}
503+
}
504+
t := &segmentTree{nums, tr}
505+
t.build(1, 1, n)
506+
return t
507+
}
508+
509+
func (t *segmentTree) build(u, l, r int) {
510+
t.tr[u].l, t.tr[u].r = l, r
511+
if l == r {
512+
t.tr[u].v = t.nums[l-1]
513+
return
514+
}
515+
mid := (l + r) >> 1
516+
t.build(u<<1, l, mid)
517+
t.build(u<<1|1, mid+1, r)
518+
t.pushup(u)
519+
}
520+
521+
func (t *segmentTree) query(u, l, r int) int {
522+
if t.tr[u].l >= l && t.tr[u].r <= r {
523+
return t.tr[u].v
524+
}
525+
mid := (t.tr[u].l + t.tr[u].r) >> 1
526+
v := 0
527+
if l <= mid {
528+
v = t.query(u<<1, l, r)
529+
}
530+
if r > mid {
531+
v = max(v, t.query(u<<1|1, l, r))
532+
}
533+
return v
534+
}
535+
536+
func (t *segmentTree) pushup(u int) {
537+
t.tr[u].v = max(t.tr[u<<1].v, t.tr[u<<1|1].v)
538+
}
539+
540+
func max(a, b int) int {
541+
if a > b {
542+
return a
543+
}
544+
return b
545+
}
546+
```
547+
207548
### **C**
208549

209550
```c

0 commit comments

Comments
 (0)