Skip to content

Commit ae5883f

Browse files
committed
feat: add solution to lc/lcof2 problem: Find Largest Value in Each Tree
Row
1 parent 335333e commit ae5883f

File tree

9 files changed

+364
-39
lines changed

9 files changed

+364
-39
lines changed

basic/searching/BinarySearch/README.md

+31-11
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,57 @@
22

33
二分的本质并非“单调性”,而是“边界”,只要找到某种性质,使得整个区间一分为二,那么就可以用二分把边界点二分出来。
44

5-
**整数二分算法模板:**
5+
## 算法模板
6+
7+
### 模板 1
68

79
```java
8-
/** 检查x是否满足某种性质 */
910
boolean check(int x) {}
1011

11-
/** 区间[left, right]被划分成[left, mid]和[mid + 1, right]时使用 */
12-
int binarySearch1(int left, int right) {
12+
int search(int left, int right) {
1313
while (left < right) {
1414
int mid = (left + right) >> 1;
15-
if (check(mid)) right = mid;
16-
else left = mid + 1;
15+
if (check(mid)) {
16+
right = mid;
17+
} else {
18+
left = mid + 1;
19+
}
1720
}
1821
return left;
1922
}
23+
```
24+
25+
### 模板 2
26+
27+
```java
28+
boolean check(int x) {}
2029

21-
/** 区间[left, right] 被划分成[left, mid - 1]和[mid, right]时使用 */
22-
int binarySearch2(int left, int right) {
30+
int search(int left, int right) {
2331
while (left < right) {
2432
int mid = (left + right + 1) >> 1;
25-
if (check(mid)) left = mid;
26-
else right = mid - 1;
33+
if (check(mid)) {
34+
left = mid;
35+
} else {
36+
right = mid - 1;
37+
}
2738
}
2839
return left;
2940
}
3041
```
3142

43+
我们做二分题目时,可以按照以下步骤:
44+
45+
1. 写出循环条件:`while (left < right)`,注意是 `left < right`,而非 `left <= right`
46+
1. 循环体内,先无脑写出 `mid = (left + right) >> 1`
47+
1. 根据具体题目,实现 `check()` 函数(有时很简单的逻辑,可以不定义函数),想一下究竟要用 `left = mid`(模板二) 还是 `right = mid`(模板一);
48+
- 如果 `left = mid`,那么无脑写出 else 语句 `right = mid - 1`,并且在 mid 计算时补充 +1,即 `mid = (left + right + 1) >> 1`
49+
- 如果 `right = mid`,那么无脑写出 else 语句 `left = mid + 1`,并且不需要更改 mid 的计算;
50+
1. 循环结束时,left 与 right 相等。
51+
3252
## 例题
3353

3454
- [在排序数组中查找元素的第一个和最后一个位置](/solution/0000-0099/0034.Find%20First%20and%20Last%20Position%20of%20Element%20in%20Sorted%20Array/README.md)
3555
- [x 的平方根](/solution/0000-0099/0069.Sqrt%28x%29/README.md)
3656
- [寻找峰值](/solution/0100-0199/0162.Find%20Peak%20Element/README.md)
3757
- [第一个错误的版本](/solution/0200-0299/0278.First%20Bad%20Version/README.md)
38-
- [不动点](/solution/1000-1099/1064.Fixed%20Point/README.md)
58+
- [不动点](/solution/1000-1099/1064.Fixed%20Point/README.md)
+22-11
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,38 @@
11
# Binary Search
22

3-
**Algorithm Templates:**
3+
## Algorithm Templates
4+
5+
### Template 1
46

57
```java
6-
/** check x if valid */
78
boolean check(int x) {}
89

9-
/** template1 */
10-
int binarySearch1(int left, int right) {
10+
int search(int left, int right) {
1111
while (left < right) {
1212
int mid = (left + right) >> 1;
13-
if (check(mid)) right = mid;
14-
else left = mid + 1;
13+
if (check(mid)) {
14+
right = mid;
15+
} else {
16+
left = mid + 1;
17+
}
1518
}
1619
return left;
1720
}
21+
```
22+
23+
### Template 1
24+
25+
```java
26+
boolean check(int x) {}
1827

19-
/** template2 */
20-
int binarySearch2(int left, int right) {
28+
int search(int left, int right) {
2129
while (left < right) {
2230
int mid = (left + right + 1) >> 1;
23-
if (check(mid)) left = mid;
24-
else right = mid - 1;
31+
if (check(mid)) {
32+
left = mid;
33+
} else {
34+
right = mid - 1;
35+
}
2536
}
2637
return left;
2738
}
@@ -33,4 +44,4 @@ int binarySearch2(int left, int right) {
3344
- [Sqrt(x)](/solution/0000-0099/0069.Sqrt%28x%29/README_EN.md)
3445
- [Find Peak Element](/solution/0100-0199/0162.Find%20Peak%20Element/README_EN.md)
3546
- [First Bad Version](/solution/0200-0299/0278.First%20Bad%20Version/README_EN.md)
36-
- [Fixed Point](/solution/1000-1099/1064.Fixed%20Point/README_EN.md)
47+
- [Fixed Point](/solution/1000-1099/1064.Fixed%20Point/README_EN.md)

lcof2/剑指 Offer II 044. 二叉树每层的最大值/README.md

+73-9
Original file line numberDiff line numberDiff line change
@@ -75,22 +75,86 @@
7575

7676
<!-- 这里可写通用的实现逻辑 -->
7777

78+
“BFS 层次遍历”实现。
79+
7880
<!-- tabs:start -->
7981

8082
### **Python3**
8183

8284
<!-- 这里可写当前语言的特殊实现逻辑 -->
8385

8486
```python
85-
87+
# Definition for a binary tree node.
88+
# class TreeNode:
89+
# def __init__(self, val=0, left=None, right=None):
90+
# self.val = val
91+
# self.left = left
92+
# self.right = right
93+
class Solution:
94+
def largestValues(self, root: TreeNode) -> List[int]:
95+
if root is None:
96+
return []
97+
q = collections.deque([root])
98+
res = []
99+
while q:
100+
n = len(q)
101+
t = float('-inf')
102+
for _ in range(n):
103+
node = q.popleft()
104+
t = max(t, node.val)
105+
if node.left:
106+
q.append(node.left)
107+
if node.right:
108+
q.append(node.right)
109+
res.append(t)
110+
return res
86111
```
87112

88113
### **Java**
89114

90115
<!-- 这里可写当前语言的特殊实现逻辑 -->
91116

92117
```java
93-
118+
/**
119+
* Definition for a binary tree node.
120+
* public class TreeNode {
121+
* int val;
122+
* TreeNode left;
123+
* TreeNode right;
124+
* TreeNode() {}
125+
* TreeNode(int val) { this.val = val; }
126+
* TreeNode(int val, TreeNode left, TreeNode right) {
127+
* this.val = val;
128+
* this.left = left;
129+
* this.right = right;
130+
* }
131+
* }
132+
*/
133+
class Solution {
134+
public List<Integer> largestValues(TreeNode root) {
135+
if (root == null) {
136+
return Collections.emptyList();
137+
}
138+
Deque<TreeNode> q = new ArrayDeque<>();
139+
q.offer(root);
140+
List<Integer> res = new ArrayList<>();
141+
while (!q.isEmpty()) {
142+
int t = Integer.MIN_VALUE;
143+
for (int i = 0, n = q.size(); i < n; ++i) {
144+
TreeNode node = q.poll();
145+
t = Math.max(t, node.val);
146+
if (node.left != null) {
147+
q.offer(node.left);
148+
}
149+
if (node.right != null) {
150+
q.offer(node.right);
151+
}
152+
}
153+
res.add(t);
154+
}
155+
return res;
156+
}
157+
}
94158
```
95159

96160
### **C++**
@@ -100,32 +164,32 @@ class Solution {
100164
public:
101165
vector<int> largestValues(TreeNode* root) {
102166
vector<int> res;
103-
if( !root )
167+
if (!root)
104168
{
105169
return res;
106170
}
107171

108-
deque<TreeNode* > deq;
172+
deque<TreeNode *> deq;
109173
deq.push_back(root);
110-
while( !deq.empty())
174+
while (!deq.empty())
111175
{
112176
int size = deq.size();
113177
int maxnum = INT_MIN;
114178
for (int i = 0; i < size; i++)
115179
{
116-
TreeNode* ptr = deq.front();
180+
TreeNode *ptr = deq.front();
117181
deq.pop_front();
118-
if(maxnum < ptr->val)
182+
if (maxnum < ptr->val)
119183
{
120184
maxnum = ptr->val;
121185
}
122186

123-
if(ptr->left)
187+
if (ptr->left)
124188
{
125189
deq.push_back(ptr->left);
126190
}
127191

128-
if(ptr->right)
192+
if (ptr->right)
129193
{
130194
deq.push_back(ptr->right);
131195
}

lcof2/剑指 Offer II 044. 二叉树每层的最大值/Solution.cpp

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,33 @@
11
class Solution {
22
public:
3-
vector<int> largestValues(TreeNode* root) {
3+
vector<int> largestValues(TreeNode *root) {
44
vector<int> res;
5-
if( !root )
5+
if (!root)
66
{
77
return res;
88
}
99

10-
deque<TreeNode* > deq;
10+
deque<TreeNode *> deq;
1111
deq.push_back(root);
12-
while( !deq.empty())
12+
while (!deq.empty())
1313
{
1414
int size = deq.size();
1515
int maxnum = INT_MIN;
1616
for (int i = 0; i < size; i++)
1717
{
18-
TreeNode* ptr = deq.front();
18+
TreeNode *ptr = deq.front();
1919
deq.pop_front();
20-
if(maxnum < ptr->val)
20+
if (maxnum < ptr->val)
2121
{
2222
maxnum = ptr->val;
2323
}
2424

25-
if(ptr->left)
25+
if (ptr->left)
2626
{
2727
deq.push_back(ptr->left);
2828
}
2929

30-
if(ptr->right)
30+
if (ptr->right)
3131
{
3232
deq.push_back(ptr->right);
3333
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/**
2+
* Definition for a binary tree node.
3+
* public class TreeNode {
4+
* int val;
5+
* TreeNode left;
6+
* TreeNode right;
7+
* TreeNode() {}
8+
* TreeNode(int val) { this.val = val; }
9+
* TreeNode(int val, TreeNode left, TreeNode right) {
10+
* this.val = val;
11+
* this.left = left;
12+
* this.right = right;
13+
* }
14+
* }
15+
*/
16+
class Solution {
17+
public List<Integer> largestValues(TreeNode root) {
18+
if (root == null) {
19+
return Collections.emptyList();
20+
}
21+
Deque<TreeNode> q = new ArrayDeque<>();
22+
q.offer(root);
23+
List<Integer> res = new ArrayList<>();
24+
while (!q.isEmpty()) {
25+
int t = Integer.MIN_VALUE;
26+
for (int i = 0, n = q.size(); i < n; ++i) {
27+
TreeNode node = q.poll();
28+
t = Math.max(t, node.val);
29+
if (node.left != null) {
30+
q.offer(node.left);
31+
}
32+
if (node.right != null) {
33+
q.offer(node.right);
34+
}
35+
}
36+
res.add(t);
37+
}
38+
return res;
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# Definition for a binary tree node.
2+
# class TreeNode:
3+
# def __init__(self, val=0, left=None, right=None):
4+
# self.val = val
5+
# self.left = left
6+
# self.right = right
7+
class Solution:
8+
def largestValues(self, root: TreeNode) -> List[int]:
9+
if root is None:
10+
return []
11+
q = collections.deque([root])
12+
res = []
13+
while q:
14+
n = len(q)
15+
t = float('-inf')
16+
for _ in range(n):
17+
node = q.popleft()
18+
t = max(t, node.val)
19+
if node.left:
20+
q.append(node.left)
21+
if node.right:
22+
q.append(node.right)
23+
res.append(t)
24+
return res

0 commit comments

Comments
 (0)