-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCartesianTree.java
More file actions
95 lines (77 loc) · 2 KB
/
CartesianTree.java
File metadata and controls
95 lines (77 loc) · 2 KB
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
package gfg.ds.advanced;
/** @noinspection WeakerAccess */
public class CartesianTree {
private CartesianTreeNode root;
private CartesianTreeNode rightMost;
public CartesianTreeNode getRoot() {
return root;
}
public CartesianTreeNode getRightMost() {
return rightMost;
}
public CartesianTree insert(int... values) {
for (int value : values) {
insert(value);
}
return this;
}
/** t=O(n*log n); On average */
public CartesianTree insert(int data) {
if (isEmpty()) {
root = rightMost = new CartesianTreeNode(data);
return this;
}
CartesianTreeNode ancestor = rightMost;
for (; ancestor != null; ) {
if (ancestor.data > data) {
CartesianTreeNode ancestorRightChild = ancestor.right;
CartesianTreeNode newNode = new CartesianTreeNode(data);
newNode.parent = ancestor;
ancestor.right = newNode;
newNode.left = ancestorRightChild;
if (ancestorRightChild != null) {
ancestorRightChild.parent = newNode;
}
break;
}
ancestor = ancestor.parent;
}
if (ancestor == null) {
CartesianTreeNode newNode = new CartesianTreeNode(data);
newNode.left = root;
root.parent = newNode;
root = newNode;
rightMost = newNode;
return this;
}
if (ancestor == rightMost) {
rightMost = rightMost.right;
}
return this;
}
public boolean isEmpty() {
return root == null;
}
public static class CartesianTreeNode {
private int data;
private CartesianTreeNode left;
private CartesianTreeNode right;
private CartesianTreeNode parent;
public CartesianTreeNode(int data) {
this.data = data;
}
public int getData() {
return data;
}
public CartesianTreeNode getLeft() {
return left;
}
public CartesianTreeNode getRight() {
return right;
}
@Override
public String toString() {
return "CartesianTreeNode{" + "data=" + data + '}';
}
}
}