Advertisement
Guest User

Untitled

a guest
Nov 21st, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.87 KB | None | 0 0
  1. /*
  2. Marcel Hanser
  3.  
  4. I create a class, My Comparator, where i make my compare method
  5. I make a Constructor of my Heap with my Comparator
  6. For my Enqueue I merge my _root with my new Node
  7. If one of the is null, i can just return the other
  8. I use my Comparator to check if my _root or my new Node has a higher Priority
  9. If my new Node has a higher Priority, I swap the 2
  10. I recursively call my merge and use the right of my higher priority
  11. to merge with the other until i get to a null. If i get there I return the other
  12.  
  13.  
  14. */
  15.  
  16.  
  17. import java.util.Comparator;
  18. import java.util.LinkedList;
  19. import java.util.Queue;
  20.  
  21. public class BHeap<T> implements Comparator<T> {
  22. Comparator _comparetor;
  23. Node _root;
  24.  
  25.  
  26. public BHeap(Comparator<T> comparator) {
  27. _comparetor = comparator;
  28. }
  29.  
  30. public void Enqueue(T value) {
  31. _root = merge(_root, new Node(value));
  32. }
  33.  
  34. private Node merge(Node r1, Node r2) {
  35. if (r1 == null) {
  36. return r2;
  37. }
  38. if (r2 == null) {
  39. return r1;
  40. }
  41. if (_comparetor.compare(r1.get_value(), r2.get_value()) > 0) {
  42. Node temp = r1;
  43. r1 = r2;
  44. r2 = temp;
  45. }
  46.  
  47. r1.set_right(merge(r1.get_right(),r2));
  48.  
  49. if (r1.get_left() == null) {
  50. r1.set_left(r1.get_right());
  51. r1.set_right(null);
  52. } else {
  53. if (r1.get_left().get_s() < r1.get_right().get_s()) {
  54. Node temp = r1.get_left();
  55. r1.set_left(r1.get_right());
  56. r1.set_right(temp);
  57. }
  58. r1.set_s(r1.get_right().get_s() + 1);
  59. }
  60. return r1;
  61. }
  62.  
  63. public boolean isEmpty() {
  64. return (_root == null);
  65. }
  66.  
  67. public T Dequeue() {
  68. if (isEmpty()) {
  69. return null;
  70. }
  71. T value = (T) _root.get_value();
  72. _root = merge(_root.get_left(),_root.get_right());
  73. return value;
  74. }
  75.  
  76. @Override
  77. public int compare(T o1, T o2) {
  78. return _comparetor.compare(o1,o2);
  79. }
  80.  
  81. public void debugPrint() {
  82. level(_root);
  83. }
  84.  
  85. private void level(Node root) {
  86. Queue<Node> q = new LinkedList<>();
  87. q.add(root);
  88. Node n = new Node();
  89. while (!q.isEmpty()) {
  90. n = q.remove();
  91. System.out.println(n.get_value());
  92. if (n.get_left() != null) {
  93. System.out.println("Left Child: " + n.get_left().get_value());
  94. }
  95. if (n.get_right() != null) {
  96. System.out.println("Right Child: " + n.get_right().get_value());
  97. }
  98. System.out.println();
  99. if (n.get_left() != null) {
  100. q.add(n.get_left());
  101. }
  102. if (n.get_right() != null) {
  103. q.add(n.get_right());
  104. }
  105. }
  106. }
  107.  
  108.  
  109. }
  110.  
  111.  
  112.  
  113.  
  114. import java.util.Comparator;
  115.  
  116. public class MyComparator<T extends Comparable> implements Comparator<T>
  117. {
  118. public int compare(T value1, T value2)
  119. {
  120. return value1.compareTo(value2);
  121. }
  122. }
  123.  
  124.  
  125.  
  126. public class Node<T> {
  127. T _value;
  128. private Node _left;
  129.  
  130. public int get_s() {
  131. return _s;
  132. }
  133.  
  134. public void set_s(int _s) {
  135. this._s = _s;
  136. }
  137.  
  138. private int _s;
  139.  
  140. public T get_value() {
  141. return _value;
  142. }
  143.  
  144. public void set_value(T _value) {
  145. this._value = _value;
  146. }
  147.  
  148. public Node get_left() {
  149. return _left;
  150. }
  151.  
  152. public void set_left(Node _left) {
  153. this._left = _left;
  154. }
  155.  
  156. public Node get_right() {
  157. return _right;
  158. }
  159.  
  160. public void set_right(Node _right) {
  161. this._right = _right;
  162. }
  163.  
  164. private Node _right;
  165.  
  166. public Node() {
  167. _s = 0;
  168. }
  169.  
  170. public Node(T value) {
  171. _value = value;
  172. _s = 0;
  173. }
  174. }
  175.  
  176.  
  177.  
  178.  
  179.  
  180.  
  181.  
  182. /*
  183. Marcel Hanser
  184. Uebung 5-1
  185. RB Tree
  186. Insert
  187. I insert every RBNode as red and then i Rebalance
  188. There I have 3 Cases
  189. Case 1: I'm at the root, I just color it black
  190. Case 2: Parent is Red and Uncle is Red,
  191. also easy, I color Grandparent, Parent and Uncle Black and if
  192. Grandparent is the root
  193. Case 3: Uncle is Black or null
  194. I have to rotate, to the left or right, depending where the uncle is
  195. if Uncle is on the other side as the child (e.g. uncle is left, child is a right child)
  196. I rotate the parent to the other side and recolor uncle and parent
  197. if they're on the same side, i rotate the grandparent and Rebalance again at the
  198. node that is now the child of my inserted node to make the RBTree right again
  199.  
  200. If i rotate the _root, i also have to set the root to the new _root
  201.  
  202. */
  203.  
  204. import java.util.LinkedList;
  205. import java.util.Queue;
  206.  
  207. public class RBTree<T extends Comparable> {
  208.  
  209. private RBNode _root;
  210. private RBNode _insertedNode;
  211.  
  212. public void rBinsert(T x) {
  213. _root = insert(_root, x, null);
  214. Rebalance();
  215. }
  216.  
  217.  
  218. private RBNode insert(RBNode root, T insKey, RBNode parent) {
  219. if (root == null) {
  220. _insertedNode = new RBNode(insKey, true, parent);
  221. return _insertedNode;
  222. }
  223. if (root.get_key().compareTo(insKey) >= 0) {
  224. root.set_left(insert(root.get_left(), insKey, root));
  225. } else {
  226. root.set_right(insert(root.get_right(), insKey, root));
  227. }
  228. return root;
  229. }
  230.  
  231.  
  232. private void Rebalance() {
  233. if (_insertedNode == _root) { //Case 1: I'm at the root
  234. _insertedNode.set_isRed(false);
  235. } else {
  236. if (_insertedNode.get_parent().isRed()) { //Case 2
  237. if (_insertedNode.get_key().compareTo(_insertedNode.get_parent().get_parent().get_key()) >= 0) { // if uncle is to the left
  238. if (_insertedNode.get_parent().get_parent().get_left() != null && _insertedNode.get_parent().get_parent().get_left().isRed()) { //case3: if uncle is red
  239. _insertedNode.get_parent().get_parent().set_isRed(true);
  240. _insertedNode.get_parent().set_isRed(false);
  241. _insertedNode.get_parent().get_parent().get_left().set_isRed(false);
  242. _insertedNode = _insertedNode.get_parent().get_parent();
  243. Rebalance();
  244. } else {
  245. if (_insertedNode.get_parent().get_key().compareTo(_insertedNode.get_key()) < 0) { //if insertedNode is a right child
  246. RBNode grandGrandParent = new RBNode();
  247. grandGrandParent = null;
  248. if (_insertedNode.get_parent().get_parent().get_parent() != null) {
  249. grandGrandParent = _insertedNode.get_parent().get_parent().get_parent();
  250. }
  251. if (grandGrandParent == null) {
  252. rotateLeft(_insertedNode.get_parent().get_parent());
  253. _root = _insertedNode.get_parent();
  254. }
  255. else {
  256. if (grandGrandParent.get_right() == _insertedNode.get_parent().get_parent()) {
  257. grandGrandParent.set_right((rotateLeft(_insertedNode.get_parent().get_parent())));
  258. }
  259. else {
  260. grandGrandParent.set_left((rotateLeft(_insertedNode.get_parent().get_parent())));
  261. }
  262. }
  263. _insertedNode.get_parent().get_left().set_isRed(true);
  264. _insertedNode.get_parent().set_isRed(false);
  265. _insertedNode = _insertedNode.get_parent();
  266. } else {
  267. RBNode grandParent = null;
  268. if (_insertedNode.get_parent().get_parent() != null) {
  269. grandParent = _insertedNode.get_parent().get_parent();
  270. }
  271. if (grandParent == null) {
  272. rotateRight(_insertedNode.get_parent());
  273. _root = _insertedNode.get_parent();
  274. }
  275. else {
  276. if (grandParent.get_right() == _insertedNode.get_parent().get_parent()) {
  277. grandParent.set_right((rotateRight(_insertedNode.get_parent())));
  278. }
  279. else {
  280. grandParent.set_right((rotateRight(_insertedNode.get_parent())));
  281. }
  282. }
  283. if (_insertedNode.get_right() != null) {
  284. _insertedNode = _insertedNode.get_right();
  285. }
  286. Rebalance();
  287. }
  288. }
  289. } else { // if uncle is to the right
  290. if (_insertedNode.get_parent().get_parent().get_right() != null && _insertedNode.get_parent().get_parent().get_right().isRed()) { //case3: if uncle is red
  291. _insertedNode.get_parent().get_parent().set_isRed(true);
  292. _insertedNode.get_parent().set_isRed(false);
  293. _insertedNode.get_parent().get_parent().get_right().set_isRed(false);
  294. _insertedNode = _insertedNode.get_parent().get_parent();
  295. Rebalance();
  296. } else {
  297. if (_insertedNode.get_parent().get_key().compareTo(_insertedNode.get_key()) < 0) { //if insertedNode is a right child
  298. RBNode grandParent = null;
  299. if (_insertedNode.get_parent().get_parent() != null) {
  300. grandParent = _insertedNode.get_parent().get_parent();
  301. }
  302. if (grandParent == null) {
  303. rotateLeft(_insertedNode.get_parent());
  304. _root = _insertedNode.get_parent();
  305. }
  306. else {
  307. if (grandParent.get_left() == _insertedNode.get_parent().get_parent()) {
  308. grandParent.set_left((rotateLeft(_insertedNode.get_parent())));
  309. }
  310. else {
  311. grandParent.set_left((rotateLeft(_insertedNode.get_parent())));
  312. }
  313. }
  314. if (_insertedNode.get_left() != null) {
  315. _insertedNode = _insertedNode.get_left();
  316. }
  317. Rebalance();
  318. }
  319. else {
  320. RBNode grandGrandParent = new RBNode();
  321. grandGrandParent = null;
  322. if (_insertedNode.get_parent().get_parent().get_parent() != null) {
  323. grandGrandParent = _insertedNode.get_parent().get_parent().get_parent();
  324. }
  325. if (grandGrandParent == null) {
  326. rotateRight(_insertedNode.get_parent().get_parent());
  327. _root = _insertedNode.get_parent();
  328. }
  329. else {
  330. if (grandGrandParent.get_right() == _insertedNode.get_parent().get_parent()) {
  331. grandGrandParent.set_right((rotateRight(_insertedNode.get_parent().get_parent())));
  332. }
  333. else {
  334. grandGrandParent.set_left((rotateRight(_insertedNode.get_parent().get_parent())));
  335. }
  336. }
  337.  
  338. _insertedNode.get_parent().get_right().set_isRed(true);
  339. _insertedNode.get_parent().set_isRed(false);
  340. _insertedNode = _insertedNode.get_parent();
  341. }
  342. }
  343. }
  344. }
  345. }
  346. }
  347.  
  348. private RBNode rotateLeft(RBNode root) {
  349. root.get_right().set_parent(root.get_parent());
  350. root.set_parent(root.get_right());
  351. root.set_right(root.get_right().get_left());
  352. root.get_parent().set_left(root);
  353. if (root.get_right() != null) {
  354. root.get_right().set_parent(root);
  355. }
  356. root = root.get_parent();
  357. return root;
  358. }
  359.  
  360. private RBNode rotateRight(RBNode root) {
  361. root.get_left().set_parent(root.get_parent());
  362. root.set_parent(root.get_left());
  363. root.set_left(root.get_left().get_right());
  364. root.get_parent().set_right(root);
  365. if (root.get_left() != null) {
  366. root.get_left().set_parent(root);
  367. }
  368. root = root.get_parent();
  369. return root;
  370. }
  371.  
  372. public int getRBHeight() {
  373. RBNode root = _root;
  374. int i = 0;
  375. while (root != null) {
  376. if (!root.isRed()) {
  377. i++;
  378. }
  379. root = root.get_left();
  380. }
  381. return i;
  382. }
  383.  
  384.  
  385. public void debugPrint() {
  386. level(_root);
  387. }
  388.  
  389. private void level(RBNode root) {
  390. Queue<RBNode> q = new LinkedList<>();
  391. q.add(root);
  392. RBNode n = new RBNode();
  393. while (!q.isEmpty()) {
  394. n = q.remove();
  395. System.out.print(n.get_key() + " Color: ");
  396. if (n.isRed()) {
  397. System.out.println("Red");
  398. }
  399. else {
  400. System.out.println("Black");
  401. }
  402. if (n.get_parent() != null) {
  403. System.out.println("Parent: " + n.get_parent().get_key());
  404. }
  405. if (n.get_left() != null) {
  406. System.out.println("Left Child: " + n.get_left().get_key());
  407. }
  408. if (n.get_right() != null) {
  409. System.out.println("Right Child: " + n.get_right().get_key());
  410. }
  411. System.out.println();
  412. if (n.get_left() != null) {
  413. q.add(n.get_left());
  414. }
  415. if (n.get_right() != null) {
  416. q.add(n.get_right());
  417. }
  418. }
  419. }
  420. }
  421.  
  422.  
  423.  
  424.  
  425.  
  426. public class RBNode<T extends Comparable> {
  427. private RBNode _left;
  428. private RBNode _right;
  429. private RBNode _parent;
  430. private boolean _isRed;//true = red -- falese = black
  431. private T _key;
  432.  
  433. public RBNode() {
  434.  
  435. }
  436.  
  437. public RBNode(T key) {
  438. _key = key;
  439. }
  440.  
  441. public RBNode(T key, boolean isRed) {
  442. _key = key;
  443. _isRed = isRed;
  444. }
  445.  
  446. public RBNode(T key, boolean isRed, RBNode parent) {
  447. _key = key;
  448. _isRed = isRed;
  449. _parent = parent;
  450. }
  451.  
  452. public RBNode get_left() {
  453. return _left;
  454. }
  455.  
  456. public void set_left(RBNode left) {
  457. _left = left;
  458. }
  459.  
  460. public RBNode get_right() {
  461. return _right;
  462. }
  463.  
  464. public void set_right(RBNode right) {
  465. _right = right;
  466. }
  467.  
  468. public RBNode get_parent() {
  469. return _parent;
  470. }
  471.  
  472. public void set_parent(RBNode parent) {
  473. _parent = parent;
  474. }
  475.  
  476. public boolean isRed() {
  477. return _isRed;
  478. }
  479.  
  480. public void set_isRed(boolean isRed) {
  481. _isRed = isRed;
  482. }
  483.  
  484. public T get_key() {
  485. return _key;
  486. }
  487.  
  488. public void set_Key(T key) {
  489. _key = key;
  490. }
  491.  
  492.  
  493.  
  494. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement