This repository was archived by the owner on Feb 7, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSelf_Balancing_Cartesian_Tree.cpp
More file actions
92 lines (92 loc) · 2.66 KB
/
Self_Balancing_Cartesian_Tree.cpp
File metadata and controls
92 lines (92 loc) · 2.66 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
#include <iostream>
#include <vector>
#include <stack>
struct Node {
int key;
int priority;
Node* left;
Node* right;
Node(int k, int p) : key(k), priority(p), left(nullptr), right(nullptr) {}
};
class CartesianTree {
private:
Node* root;
public:
CartesianTree() : root(nullptr) {}
void insert(int key) {
root = insertRecursive(root, key);
}
void inOrderTraversal() const {
std::cout << "Cartesian Tree (In-Order): ";
inOrderTraversalRecursive(root);
std::cout << std::endl;
}
void preOrderTraversal() const {
std::cout << "Cartesian Tree (Pre-Order): ";
preOrderTraversalRecursive(root);
std::cout << std::endl;
}
void postOrderTraversal() const {
std::cout << "Cartesian Tree (Post-Order): ";
postOrderTraversalRecursive(root);
std::cout << std::endl;
}
private:
Node* insertRecursive(Node* root, int key) {
if (root == nullptr) {
return new Node(key, rand());
}
if (key < root->key) {
root->left = insertRecursive(root->left, key);
} else {
Node* split;
splitNode(root, key, split, root->right);
root = split;
}
return root;
}
void splitNode(Node* root, int key, Node*& left, Node*& right) {
if (root == nullptr) {
left = right = nullptr;
} else if (key < root->key) {
splitNode(root->left, key, left, root->left);
right = root;
} else {
splitNode(root->right, key, root->right, right);
left = root;
}
}
void inOrderTraversalRecursive(const Node* root) const {
if (root) {
inOrderTraversalRecursive(root->left);
std::cout << root->key << " ";
inOrderTraversalRecursive(root->right);
}
}
void preOrderTraversalRecursive(const Node* root) const {
if (root) {
std::cout << root->key << " ";
preOrderTraversalRecursive(root->left);
preOrderTraversalRecursive(root->right);
}
}
void postOrderTraversalRecursive(const Node* root) const {
if (root) {
postOrderTraversalRecursive(root->left);
postOrderTraversalRecursive(root->right);
std::cout << root->key << " ";
}
}
};
int main() {
CartesianTree cartesianTree;
cartesianTree.insert(3);
cartesianTree.insert(1);
cartesianTree.insert(4);
cartesianTree.insert(2);
cartesianTree.insert(5);
cartesianTree.inOrderTraversal();
cartesianTree.preOrderTraversal();
cartesianTree.postOrderTraversal();
return 0;
}