-
Notifications
You must be signed in to change notification settings - Fork 0
/
secound.java
134 lines (107 loc) · 2.84 KB
/
secound.java
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import java.util.Scanner;
import java.util.ArrayList;
import java.util.List;
import java.util.LinkedList;
import java.util.Queue;
class Node {
int data;
Node left, right;
Node(int value) {
data = value;
left = right = null;
}
}
public class BT_NoParentPtr_Solution1
{
Node root;
private List<Integer> path1 = new ArrayList<>();
private List<Integer> path2 = new ArrayList<>();
int findLCA(int n1, int n2) {
path1.clear();
path2.clear();
return findLCAInternal(root, n1, n2);
}
private int findLCAInternal(Node root, int n1, int n2) {
if (!findPath(root, n1, path1) || !findPath(root, n2, path2)) {
System.out.println((path1.size() > 0) ? "n1 is present" : "n1 is missing");
System.out.println((path2.size() > 0) ? "n2 is present" : "n2 is missing");
return -1;
}
int i;
for (i = 0; i < path1.size() && i < path2.size(); i++) {
// System.out.println(path1.get(i) + " " + path2.get(i));
if (!path1.get(i).equals(path2.get(i)))
break;
}
return path1.get(i-1);
}
private boolean findPath(Node root, int n, List<Integer> path)
{
if (root == null) {
return false;
}
path.add(root.data);
if (root.data == n) {
return true;
}
if (root.left != null && findPath(root.left, n, path)) {
return true;
}
if (root.right != null && findPath(root.right, n, path)) {
return true;
}
path.remove(path.size()-1);
return false;
}
int getLevelUtil(Node node, int data, int level)
{
if (node == null)
return 0;
if (node.data == data)
return level;
int downlevel = getLevelUtil(node.left, data, level + 1);
if (downlevel != 0)
return downlevel;
downlevel = getLevelUtil(node.right, data, level + 1);
return downlevel;
}
/* Returns level of given data value */
int getLevel(Node node, int data)
{
return getLevelUtil(node, data, 1);
}
public static void main(String[] args)
{
BT_NoParentPtr_Solution1 tree = new BT_NoParentPtr_Solution1();
Queue<Node> q = new LinkedList<>();
Scanner scanner = new Scanner(System.in);
int height = Integer.parseInt(scanner.next());
int a1 = Integer.parseInt(scanner.next());
int a2 = Integer.parseInt(scanner.next());
/*create root*/
tree.root = new Node(0);
q.add(tree.root);
int cnt = 1;
for (int i = 0; i <= height; i++) {
int nodeCount = q.size();
if (nodeCount == 0){
break;
}
while (nodeCount > 0)
{
Node newnode = q.peek();
q.remove();
newnode.left = new Node(cnt);
q.add(newnode.left);
cnt++;
newnode.right = new Node(cnt);
q.add(newnode.right);
cnt++;
nodeCount--;
}
}
int lca = tree.findLCA(a1,a2);
int level = tree.getLevel( tree.root, lca );
System.out.println( lca + " " + ( --level ) );
}
}