-
Notifications
You must be signed in to change notification settings - Fork 506
/
Copy pathMin distance between two given nodes of a Binary Tree.cpp
77 lines (64 loc) · 1.98 KB
/
Min distance between two given nodes of a Binary Tree.cpp
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
/*
Min distance between two given nodes of a Binary Tree
=====================================================
Given a binary tree and two node values your task is to find the minimum distance between them.
Example 1:
Input:
1
/ \
2 3
a = 2, b = 3
Output: 2
Explanation: The tree formed is:
1
/ \
2 3
We need the distance between 2 and 3.
Being at node 2, we need to take two
steps ahead in order to reach node 3.
The path followed will be:
2 -> 1 -> 3. Hence, the result is 2.
Your Task:
You don't need to read input or print anything. Your task is to complete the function findDist() which takes the root node of the Tree and the two node values a and b as input parameters and returns the minimum distance between the nodes represented by the two given node values.
Expected Time Complexity: O(N).
Expected Auxiliary Space: O(Height of the Tree).
Constraints:
1 <= Number of nodes <= 104
1 <= Data of a node <= 105
Note:The Input/Ouput format and Example given are used for system's internal purpose, and should be used by a user for Expected Output only. As it is a function problem, hence a user should not read any input from stdin/console. The task is to complete the function specified, and not to write the full code.
*/
/* A binary tree node
struct Node
{
int data;
Node* left, * right;
}; */
Node *lca(Node *root, int n1, int n2)
{
if (!root)
return NULL;
if (root->data == n1 || root->data == n2)
return root;
auto left = lca(root->left, n1, n2);
auto right = lca(root->right, n1, n2);
if (left && right)
return root;
if (left)
return left;
return right;
}
int path(Node *root, int a)
{
if (!root)
return 1000000;
if (root->data == a)
return 0;
return 1 + min(path(root->left, a), path(root->right, a));
}
/* Should return minimum distance between a and b
in a tree with given root*/
int findDist(Node *root, int a, int b)
{
Node *common = lca(root, a, b);
return path(common, a) + path(common, b);
}