Skip to content

Commit a30818c

Browse files
committed
feat: add solutions to lc problem: No.1026
No.1026.Maximum Difference Between Node and Ancestor
1 parent c58d698 commit a30818c

File tree

7 files changed

+228
-131
lines changed

7 files changed

+228
-131
lines changed

solution/1000-1099/1026.Maximum Difference Between Node and Ancestor/README.md

Lines changed: 88 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,22 @@
4848

4949
<!-- 这里可写通用的实现逻辑 -->
5050

51-
将节点的最大值、最小值自上而下传递,此过程中迭代求最大差值。
51+
**方法一:DFS**
52+
53+
对于每个节点,要求其与其祖先节点的最大差值,只需要求出该节点与祖先节点最大值和最小值的差值即可,取较大的差值即可。
54+
55+
因此,我们设计一个函数 $dfs(root, mi, mx)$,表示当前搜索到的节点为 $root$,其祖先节点的最大值为 $mx$,最小值为 $mi$,函数内更新最大差值 $ans$。
56+
57+
函数 $dfs(root, mi, mx)$ 的逻辑如下:
58+
59+
- 若 $root$ 为空,则返回。
60+
- 更新 $ans = max(ans, abs(mi - root.val), abs(mx - root.val))$。
61+
- 更新 $mi = min(mi, root.val)$, $mx = max(mx, root.val)$。
62+
- 递归左右子树。
63+
64+
最后返回 $ans$ 即可。
65+
66+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树节点个数。
5267

5368
<!-- tabs:start -->
5469

@@ -64,16 +79,16 @@
6479
# self.left = left
6580
# self.right = right
6681
class Solution:
67-
def maxAncestorDiff(self, root: TreeNode) -> int:
68-
def dfs(root, mx, mi):
82+
def maxAncestorDiff(self, root: Optional[TreeNode]) -> int:
83+
def dfs(root, mi, mx):
6984
if root is None:
7085
return
7186
nonlocal ans
72-
ans = max(ans, abs(root.val - mx), abs(root.val - mi))
73-
mx = max(mx, root.val)
87+
ans = max(ans, abs(mi - root.val), abs(mx - root.val))
7488
mi = min(mi, root.val)
75-
dfs(root.left, mx, mi)
76-
dfs(root.right, mx, mi)
89+
mx = max(mx, root.val)
90+
dfs(root.left, mi, mx)
91+
dfs(root.right, mi, mx)
7792

7893
ans = 0
7994
dfs(root, root.val, root.val)
@@ -104,21 +119,20 @@ class Solution {
104119
private int ans;
105120

106121
public int maxAncestorDiff(TreeNode root) {
107-
ans = 0;
108122
dfs(root, root.val, root.val);
109123
return ans;
110124
}
111125

112-
private void dfs(TreeNode root, int mx, int mi) {
126+
private void dfs(TreeNode root, int mi, int mx) {
113127
if (root == null) {
114128
return;
115129
}
116-
int t = Math.max(Math.abs(root.val - mx), Math.abs(root.val - mi));
117-
ans = Math.max(ans, t);
118-
mx = Math.max(mx, root.val);
130+
int x = Math.max(Math.abs(mi - root.val), Math.abs(mx - root.val));
131+
ans = Math.max(ans, x);
119132
mi = Math.min(mi, root.val);
120-
dfs(root.left, mx, mi);
121-
dfs(root.right, mx, mi);
133+
mx = Math.max(mx, root.val);
134+
dfs(root.left, mi, mx);
135+
dfs(root.right, mi, mx);
122136
}
123137
}
124138
```
@@ -139,23 +153,21 @@ class Solution {
139153
*/
140154
class Solution {
141155
public:
142-
int ans;
143-
144156
int maxAncestorDiff(TreeNode* root) {
145-
ans = 0;
157+
int ans = 0;
158+
function<void(TreeNode*, int, int)> dfs = [&](TreeNode* root, int mi, int mx) {
159+
if (!root) {
160+
return;
161+
}
162+
ans = max({ans, abs(mi - root->val), abs(mx - root->val)});
163+
mi = min(mi, root->val);
164+
mx = max(mx, root->val);
165+
dfs(root->left, mi, mx);
166+
dfs(root->right, mi, mx);
167+
};
146168
dfs(root, root->val, root->val);
147169
return ans;
148170
}
149-
150-
void dfs(TreeNode* root, int mx, int mi) {
151-
if (!root) return;
152-
int t = max(abs(root->val - mx), abs(root->val - mi));
153-
ans = max(ans, t);
154-
mx = max(mx, root->val);
155-
mi = min(mi, root->val);
156-
dfs(root->left, mx, mi);
157-
dfs(root->right, mx, mi);
158-
}
159171
};
160172
```
161173
@@ -170,29 +182,20 @@ public:
170182
* Right *TreeNode
171183
* }
172184
*/
173-
func maxAncestorDiff(root *TreeNode) int {
174-
ans := 0
175-
var dfs func(root *TreeNode, mx, mi int)
176-
dfs = func(root *TreeNode, mx, mi int) {
185+
func maxAncestorDiff(root *TreeNode) (ans int) {
186+
var dfs func(*TreeNode, int, int)
187+
dfs = func(root *TreeNode, mi, mx int) {
177188
if root == nil {
178189
return
179190
}
180-
t := max(abs(root.Val-mx), abs(root.Val-mi))
181-
ans = max(ans, t)
182-
mx = max(mx, root.Val)
191+
ans = max(ans, max(abs(mi-root.Val), abs(mx-root.Val)))
183192
mi = min(mi, root.Val)
184-
dfs(root.Left, mx, mi)
185-
dfs(root.Right, mx, mi)
193+
mx = max(mx, root.Val)
194+
dfs(root.Left, mi, mx)
195+
dfs(root.Right, mi, mx)
186196
}
187197
dfs(root, root.Val, root.Val)
188-
return ans
189-
}
190-
191-
func abs(x int) int {
192-
if x > 0 {
193-
return x
194-
}
195-
return -x
198+
return
196199
}
197200
198201
func max(a, b int) int {
@@ -208,6 +211,47 @@ func min(a, b int) int {
208211
}
209212
return b
210213
}
214+
215+
func abs(x int) int {
216+
if x < 0 {
217+
return -x
218+
}
219+
return x
220+
}
221+
```
222+
223+
### **JavaScript**
224+
225+
```js
226+
/**
227+
* Definition for a binary tree node.
228+
* function TreeNode(val, left, right) {
229+
* this.val = (val===undefined ? 0 : val)
230+
* this.left = (left===undefined ? null : left)
231+
* this.right = (right===undefined ? null : right)
232+
* }
233+
*/
234+
/**
235+
* @param {TreeNode} root
236+
* @return {number}
237+
*/
238+
var maxAncestorDiff = function (root) {
239+
let ans = 0;
240+
const dfs = (root, mi, mx) => {
241+
if (!root) {
242+
return;
243+
}
244+
ans = Math.max(
245+
...[ans, Math.abs(mi - root.val), Math.abs(mx - root.val)],
246+
);
247+
mi = Math.min(mi, root.val);
248+
mx = Math.max(mx, root.val);
249+
dfs(root.left, mi, mx);
250+
dfs(root.right, mi, mx);
251+
};
252+
dfs(root, root.val, root.val);
253+
return ans;
254+
};
211255
```
212256

213257
### **...**

solution/1000-1099/1026.Maximum Difference Between Node and Ancestor/README_EN.md

Lines changed: 72 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,16 @@ Among all possible differences, the maximum value of 7 is obtained by |8 - 1| =
5050
# self.left = left
5151
# self.right = right
5252
class Solution:
53-
def maxAncestorDiff(self, root: TreeNode) -> int:
54-
def dfs(root, mx, mi):
53+
def maxAncestorDiff(self, root: Optional[TreeNode]) -> int:
54+
def dfs(root, mi, mx):
5555
if root is None:
5656
return
5757
nonlocal ans
58-
ans = max(ans, abs(root.val - mx), abs(root.val - mi))
59-
mx = max(mx, root.val)
58+
ans = max(ans, abs(mi - root.val), abs(mx - root.val))
6059
mi = min(mi, root.val)
61-
dfs(root.left, mx, mi)
62-
dfs(root.right, mx, mi)
60+
mx = max(mx, root.val)
61+
dfs(root.left, mi, mx)
62+
dfs(root.right, mi, mx)
6363

6464
ans = 0
6565
dfs(root, root.val, root.val)
@@ -88,21 +88,20 @@ class Solution {
8888
private int ans;
8989

9090
public int maxAncestorDiff(TreeNode root) {
91-
ans = 0;
9291
dfs(root, root.val, root.val);
9392
return ans;
9493
}
9594

96-
private void dfs(TreeNode root, int mx, int mi) {
95+
private void dfs(TreeNode root, int mi, int mx) {
9796
if (root == null) {
9897
return;
9998
}
100-
int t = Math.max(Math.abs(root.val - mx), Math.abs(root.val - mi));
101-
ans = Math.max(ans, t);
102-
mx = Math.max(mx, root.val);
99+
int x = Math.max(Math.abs(mi - root.val), Math.abs(mx - root.val));
100+
ans = Math.max(ans, x);
103101
mi = Math.min(mi, root.val);
104-
dfs(root.left, mx, mi);
105-
dfs(root.right, mx, mi);
102+
mx = Math.max(mx, root.val);
103+
dfs(root.left, mi, mx);
104+
dfs(root.right, mi, mx);
106105
}
107106
}
108107
```
@@ -123,23 +122,21 @@ class Solution {
123122
*/
124123
class Solution {
125124
public:
126-
int ans;
127-
128125
int maxAncestorDiff(TreeNode* root) {
129-
ans = 0;
126+
int ans = 0;
127+
function<void(TreeNode*, int, int)> dfs = [&](TreeNode* root, int mi, int mx) {
128+
if (!root) {
129+
return;
130+
}
131+
ans = max({ans, abs(mi - root->val), abs(mx - root->val)});
132+
mi = min(mi, root->val);
133+
mx = max(mx, root->val);
134+
dfs(root->left, mi, mx);
135+
dfs(root->right, mi, mx);
136+
};
130137
dfs(root, root->val, root->val);
131138
return ans;
132139
}
133-
134-
void dfs(TreeNode* root, int mx, int mi) {
135-
if (!root) return;
136-
int t = max(abs(root->val - mx), abs(root->val - mi));
137-
ans = max(ans, t);
138-
mx = max(mx, root->val);
139-
mi = min(mi, root->val);
140-
dfs(root->left, mx, mi);
141-
dfs(root->right, mx, mi);
142-
}
143140
};
144141
```
145142
@@ -154,29 +151,20 @@ public:
154151
* Right *TreeNode
155152
* }
156153
*/
157-
func maxAncestorDiff(root *TreeNode) int {
158-
ans := 0
159-
var dfs func(root *TreeNode, mx, mi int)
160-
dfs = func(root *TreeNode, mx, mi int) {
154+
func maxAncestorDiff(root *TreeNode) (ans int) {
155+
var dfs func(*TreeNode, int, int)
156+
dfs = func(root *TreeNode, mi, mx int) {
161157
if root == nil {
162158
return
163159
}
164-
t := max(abs(root.Val-mx), abs(root.Val-mi))
165-
ans = max(ans, t)
166-
mx = max(mx, root.Val)
160+
ans = max(ans, max(abs(mi-root.Val), abs(mx-root.Val)))
167161
mi = min(mi, root.Val)
168-
dfs(root.Left, mx, mi)
169-
dfs(root.Right, mx, mi)
162+
mx = max(mx, root.Val)
163+
dfs(root.Left, mi, mx)
164+
dfs(root.Right, mi, mx)
170165
}
171166
dfs(root, root.Val, root.Val)
172-
return ans
173-
}
174-
175-
func abs(x int) int {
176-
if x > 0 {
177-
return x
178-
}
179-
return -x
167+
return
180168
}
181169
182170
func max(a, b int) int {
@@ -192,6 +180,47 @@ func min(a, b int) int {
192180
}
193181
return b
194182
}
183+
184+
func abs(x int) int {
185+
if x < 0 {
186+
return -x
187+
}
188+
return x
189+
}
190+
```
191+
192+
### **JavaScript**
193+
194+
```js
195+
/**
196+
* Definition for a binary tree node.
197+
* function TreeNode(val, left, right) {
198+
* this.val = (val===undefined ? 0 : val)
199+
* this.left = (left===undefined ? null : left)
200+
* this.right = (right===undefined ? null : right)
201+
* }
202+
*/
203+
/**
204+
* @param {TreeNode} root
205+
* @return {number}
206+
*/
207+
var maxAncestorDiff = function (root) {
208+
let ans = 0;
209+
const dfs = (root, mi, mx) => {
210+
if (!root) {
211+
return;
212+
}
213+
ans = Math.max(
214+
...[ans, Math.abs(mi - root.val), Math.abs(mx - root.val)],
215+
);
216+
mi = Math.min(mi, root.val);
217+
mx = Math.max(mx, root.val);
218+
dfs(root.left, mi, mx);
219+
dfs(root.right, mi, mx);
220+
};
221+
dfs(root, root.val, root.val);
222+
return ans;
223+
};
195224
```
196225

197226
### **...**

0 commit comments

Comments
 (0)