-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1026. Maximum Difference Between Node and Ancestor
96 lines (84 loc) · 2.58 KB
/
1026. Maximum Difference Between Node and Ancestor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
Given the root of a binary tree, find the maximum value v for which there exist different nodes a and b where v = |a.val - b.val| and a is an ancestor of b.
A node a is an ancestor of b if either: any child of a is equal to b or any child of a is an ancestor of b.
Example 1:
Input: root = [8,3,10,1,6,null,14,null,null,4,7,13]
Output: 7
Explanation: We have various ancestor-node differences, some of which are given below :
|8 - 3| = 5
|3 - 7| = 4
|8 - 1| = 7
|10 - 13| = 3
Among all possible differences, the maximum value of 7 is obtained by |8 - 1| = 7.
//brute forrce approach( time complexity - O(n^2) as every root repetedly called )
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int maxDiff;
void findmaxDiffutill(TreeNode root,TreeNode child){
if(child==null)
return;
maxDiff=Math.max(maxDiff,Math.abs(root.val-child.val));
//recursive call
findmaxDiffutill(root,child.left);
findmaxDiffutill(root,child.right);
}
void findMaxDiff(TreeNode root){
if(root==null)
return;
findmaxDiffutill(root,root.left);
findmaxDiffutill(root,root.right);
findMaxDiff(root.left);
findMaxDiff(root.right);
}
public int maxAncestorDiff(TreeNode root) {
maxDiff=-1;
findMaxDiff(root);
return maxDiff;
}
}
//optimized approach( time complexity - O(n))
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int maxAncestorDiff(TreeNode root) {
int minv=root.val;
int maxv=root.val;
return findMaxDiff(root,minv,maxv);
}
int findMaxDiff(TreeNode root,int minv,int maxv){
if(root==null){
return Math.abs(maxv-minv);
}
minv=Math.min(minv,root.val);
maxv=Math.max(maxv,root.val);
int leftDiff=findMaxDiff(root.left,minv,maxv);
int rightDiff=findMaxDiff(root.right,minv,maxv);
return Math.max(leftDiff,rightDiff);
}
}