Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.43 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. /// <summary>
  4. /// My implementation of BST. It has two classes. Node & BSTree.
  5. /// </summary>
  6. namespace BinarySearchTree
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12.  
  13. BSTree bst = new BSTree(new Node(20));
  14. bst.Insert(15);
  15. bst.Insert(25);
  16. bst.Insert(18);
  17. bst.Insert(10);
  18. bst.Insert(new Node(19));
  19. bst.Insert(new Node(16));
  20. bst.Insert(new Node(17));
  21. /*
  22. 20
  23. /
  24. 15 25
  25. /
  26. 10 18
  27. /
  28. 16 19
  29.  
  30. 17
  31.  
  32. */
  33.  
  34. bst.PrintTraversedTree(BSTree.TreeTraversalForm.BreathFirstSearch);
  35. bst.Delete(15);
  36.  
  37. /*
  38. 20
  39. /
  40. 16 25
  41. /
  42. 10 18
  43. /
  44. 17 19
  45.  
  46. */
  47.  
  48. bst.PrintTraversedTree(BSTree.TreeTraversalForm.BreathFirstSearch);
  49.  
  50. Console.WriteLine("Searching for node...");
  51. Node devetnajst = bst.BinarySearch(19);
  52. if (devetnajst != null)
  53. Console.WriteLine($"Node value: {devetnajst.value}");
  54. else
  55. Console.WriteLine("Node not found!");
  56.  
  57. Console.WriteLine("Searching for node...");
  58. Node stNiVDrevesu = bst.BinarySearch(23);
  59. if(stNiVDrevesu!=null)
  60. Console.WriteLine($"Node value: {stNiVDrevesu.value}");
  61. else
  62. Console.WriteLine("Node not found!");
  63.  
  64. Console.WriteLine("Searching for node...");
  65. Node someNode = bst.BinarySearchI(17);
  66. if (someNode != null)
  67. Console.WriteLine($"Node value: {someNode.value}");
  68. }
  69. }
  70.  
  71. /// <summary>
  72. /// class Node represents nodes of the binary three.
  73. /// </summary>
  74. class Node
  75. {
  76. public Node(int value)
  77. {
  78. this.value = value;
  79. }
  80. public int value { get; set; }
  81. public Node left { get; set; } = null;
  82. public Node right { get; set; } = null;
  83.  
  84. /// <summary>
  85. /// Returns true if node is Leaf
  86. /// </summary>
  87. /// <param name="node"></param>
  88. /// <returns></returns>
  89. public bool isLeaf()
  90. {
  91. if (this.left == null && this.right == null)
  92. return true;
  93. else
  94. return false;
  95. }
  96.  
  97. /// <summary>
  98. /// Returns true if this is left child of parent
  99. /// </summary>
  100. /// <param name="node"></param>
  101. /// <param name="parent"></param>
  102. /// <returns></returns>
  103. public bool isLeftChildOf(Node parent)
  104. {
  105. if (this == parent.left)
  106. return true;
  107. else
  108. return false;
  109. }
  110.  
  111. /// <summary>
  112. /// Returns true if this is right child of parent
  113. /// </summary>
  114. /// <param name="node"></param>
  115. /// <param name="parent"></param>
  116. /// <returns></returns>
  117. public bool isRightChildOf(Node parent)
  118. {
  119. if (this == parent.right)
  120. return true;
  121. else
  122. return false;
  123. }
  124.  
  125. /// <summary>
  126. /// return true if node has only one child
  127. /// </summary>
  128. /// <returns></returns>
  129. public bool hasOnlyOneChild()
  130. {
  131. if (!this.isLeaf() && (this.left == null || this.right == null))
  132. return true;
  133. else
  134. return false;
  135. }
  136.  
  137. }
  138.  
  139. /// <summary>
  140. /// class BSTree represent Binary Search Tree.
  141. /// </summary>
  142. class BSTree
  143. {
  144. Node _root=null; // tree root
  145. int[] _treeTraversal; //three traversal -- dynamic programing
  146. int _nodeCounter=0; //nr of nodes - used to declare _treeTraversal size
  147. int _treeTraversalIndex = 0; //used to position node in array _treeTraversal
  148. int _currentTraverseForm = -1; //if -1 -> no valid traverse of tree
  149.  
  150. /// <summary>
  151. /// Constructor
  152. /// </summary>
  153. /// <param name="root"></param>
  154. public BSTree(Node root) {
  155. _root = root;
  156. _nodeCounter++;
  157. }
  158.  
  159. /// <summary>
  160. /// Constructor
  161. /// </summary>
  162. /// <param name="rootValue"></param>
  163. public BSTree(int rootValue)
  164. {
  165. _root = new Node(rootValue);
  166. _nodeCounter++;
  167. }
  168.  
  169. /// <summary>
  170. /// Insert value into Tree
  171. /// </summary>
  172. /// <param name="value"></param>
  173. public void Insert(int value)
  174. {
  175. Insert(new Node(value));
  176. }
  177.  
  178. /// <summary>
  179. /// Insert Node into tree
  180. /// </summary>
  181. /// <param name="node">Node to be inserted.</param>
  182. /// <param name="root"></param>
  183. public void Insert(Node node, Node root=null)
  184. {
  185. if (root == null)
  186. {
  187. root = _root; // if no root is specified use tree root
  188. }
  189.  
  190. if (node.value == root.value)
  191. {
  192. Console.WriteLine($"Unable to insert! Value {node.value} allready exist!");
  193. return;
  194. }
  195.  
  196. if (node.value<root.value)
  197. {
  198. if (root.left == null)
  199. {
  200. root.left = node;
  201. _nodeCounter++;
  202. _currentTraverseForm = -1; // when you insert new node current stored traverse is not valid anymore
  203. }
  204. else
  205. {
  206. Insert(node, root.left);
  207. }
  208. }
  209. else
  210. {
  211. if (root.right == null)
  212. {
  213. root.right = node;
  214. _nodeCounter++;
  215. _currentTraverseForm = -1;
  216. }
  217. else
  218. {
  219. Insert(node, root.right);
  220. }
  221. }
  222.  
  223. }
  224.  
  225. /// <summary>
  226. /// Binary Search throught the tree for value - recursive
  227. /// </summary>
  228. /// <param name="value">searched value</param>
  229. /// <param name="root"></param>
  230. /// <returns>Node if found, otherwise returns null</returns>
  231. public Node BinarySearch(int value, Node root = null)
  232. {
  233. if (root == null)
  234. {
  235. root = _root;
  236. }
  237.  
  238. if (value == root.value)
  239. {
  240. return root;
  241. }
  242.  
  243. if (value < root.value)
  244. {
  245. if (root.left != null)
  246. {
  247. return BinarySearch(value, root.left);
  248. }
  249. else
  250. {
  251. return null;
  252. }
  253. }
  254. else
  255. {
  256. if (root.right != null)
  257. {
  258. return BinarySearch(value, root.right);
  259. }
  260. else
  261. {
  262. return null;
  263. }
  264. }
  265.  
  266.  
  267. }
  268.  
  269. /// <summary>
  270. /// Binary Search Iterative
  271. /// </summary>
  272. /// <param name="value"></param>
  273. /// <returns></returns>
  274. public Node BinarySearchI(int value)
  275. {
  276. Node node = _root;
  277.  
  278. for (int i = 0; i < _nodeCounter;i++) {
  279. if (value == node.value)
  280. {
  281. return node;
  282. }
  283. else if (value < node.value && node.left != null)
  284. {
  285. node = node.left;
  286. }
  287. else if (node.right != null)
  288. {
  289. node = node.right;
  290. }
  291. else
  292. {
  293. Console.WriteLine("Value not found!");
  294. break;
  295. }
  296.  
  297. }
  298. return null;
  299. }
  300.  
  301.  
  302.  
  303. /// <summary>
  304. /// get Next inorder - smalest from right subtree
  305. /// </summary>
  306. /// <param name="root"></param>
  307. public Node GetNextInorder(Node node)
  308. {
  309.  
  310. return Smalest(node.right);
  311. }
  312.  
  313. /// <summary>
  314. /// get smallest from from root - most left in subtree or tree
  315. /// </summary>
  316. /// <param name="root"></param>
  317. private Node Smalest(Node root)
  318. {
  319.  
  320. Node minNode = root.left;
  321.  
  322. while (root.left != null)
  323. {
  324. root = root.left;
  325. minNode = root;
  326. }
  327.  
  328. return minNode;
  329. }
  330.  
  331. /// <summary>
  332. /// Deletes the node
  333. /// </summary>
  334. /// <param name="node"></param>
  335. /// <param name="root"></param>
  336.  
  337. public void Delete(Node node, Node root = null)
  338. {
  339. if (node == null) {
  340. Console.WriteLine("Please enter valid node!");
  341. return;
  342. }
  343.  
  344. if (root == null)
  345. {
  346. root = _root;
  347. Console.WriteLine($"Deleting node: {node.value}");
  348. }
  349.  
  350. //if node is child of root->we found parents of child
  351. if (node.isLeftChildOf(root) || node.isRightChildOf(root))
  352. {
  353. if (node.isLeaf()) // if is Leaf just remove it - remove reference at parrent
  354. {
  355. if (node.isLeftChildOf(root))
  356. root.left = null;
  357. else
  358. root.right = null;
  359.  
  360. _currentTraverseForm = -1;
  361. _nodeCounter--;
  362. }
  363. else if (node.hasOnlyOneChild()) // if only one child replace node with child
  364. {
  365. if (node.left == null)
  366. {
  367. node.value = node.right.value;
  368. node.left = node.right.left;
  369. node.right = node.right.right;
  370. }
  371. else
  372. {
  373. node.value = node.left.value;
  374. node.left = node.left.left;
  375. node.right = node.left.right;
  376. }
  377.  
  378. _currentTraverseForm = -1;
  379. _nodeCounter--;
  380.  
  381. }
  382. else //else replace node with next in-order.
  383. {
  384. Node tmpNode = GetNextInorder(node);
  385. node.value = tmpNode.value;
  386. Delete(tmpNode, node);
  387.  
  388. _currentTraverseForm = -1;
  389. }
  390.  
  391. }
  392. else // else we need to dig deeper to the left or right
  393. {
  394. if (root.left != null && node.value < root.value)
  395. Delete(node, root.left);
  396. else if(root.right!=null)
  397. Delete(node, root.right);
  398. }
  399.  
  400. }
  401.  
  402. /// <summary>
  403. /// Deletes the node using value and binary search
  404. /// </summary>
  405. /// <param name="value"></param>
  406. /// <param name="root"></param>
  407. public void Delete(int value, Node root = null)
  408. {
  409. Delete(BinarySearch(value));
  410. }
  411.  
  412. /// <summary>
  413. /// enum specifaing posible tree traversal forms
  414. /// DFS - Depth-first search
  415. /// </summary>
  416. public enum TreeTraversalForm
  417. {
  418. DFSpreorder,
  419. DFSinorder,
  420. DFSoutorder,
  421. DFSpostorder,
  422. BreathFirstSearch
  423. };
  424.  
  425. /// <summary>
  426. /// Maps the tree traversal form with appropriate method
  427. /// </summary>
  428. /// <param name="traversalForm"></param>
  429. /// <returns></returns>
  430. public int[] TraverseTree(TreeTraversalForm traversalForm)
  431. {
  432.  
  433. //if tree is already traversed -> dont do it again
  434. if ((int)traversalForm != _currentTraverseForm)
  435. {
  436. switch (traversalForm)
  437. {
  438. case TreeTraversalForm.DFSinorder:
  439. this.Inorder();
  440. break;
  441. case TreeTraversalForm.DFSoutorder:
  442. this.Outorder();
  443. break;
  444. case TreeTraversalForm.DFSpostorder:
  445. this.Postorder();
  446. break;
  447. case TreeTraversalForm.DFSpreorder:
  448. this.Preorder();
  449. break;
  450. case TreeTraversalForm.BreathFirstSearch:
  451. this.BreathFirstSearch();
  452. break;
  453. default:
  454. Console.WriteLine("Unknown form!");
  455. break;
  456. }
  457. }
  458.  
  459. return _treeTraversal;
  460. }
  461.  
  462. /// <summary>
  463. /// Prints traversed tree to Console
  464. /// </summary>
  465. /// <param name="traversalForm"></param>
  466. public void PrintTraversedTree(TreeTraversalForm traversalForm)
  467. {
  468.  
  469. //if tree is already traversed -> dont do it again
  470. if ((int)traversalForm != _currentTraverseForm)
  471. {
  472. this.TraverseTree(traversalForm);
  473. }
  474.  
  475. Console.Write(traversalForm.ToString() + ": ");
  476. foreach (int val in _treeTraversal)
  477. {
  478. Console.Write($"{val} ");
  479. }
  480. Console.WriteLine();
  481. }
  482.  
  483. /// <summary>
  484. /// Creates DFS - Pre-order traverse and stors it in _treeTraversal
  485. /// </summary>
  486. /// <param name="root"></param>
  487. void Preorder(Node root = null)
  488. {
  489. if (root == null)
  490. {
  491. root = _root;
  492. _treeTraversal = new int[_nodeCounter];
  493. _treeTraversalIndex = 0;
  494. _currentTraverseForm = (int)TreeTraversalForm.DFSpreorder;
  495. }
  496.  
  497. _treeTraversal[_treeTraversalIndex] = root.value;
  498. _treeTraversalIndex++;
  499.  
  500. if (root.left != null)
  501. Preorder(root.left);
  502.  
  503. if (root.right != null)
  504. Preorder(root.right);
  505. }
  506.  
  507. /// <summary>
  508. /// Creates DFS - In-order traverse and stors it in _treeTraversal
  509. /// </summary>
  510. /// <param name="root"></param>
  511. void Inorder(Node root = null)
  512. {
  513. if (root == null)
  514. {
  515. root = _root;
  516. _treeTraversal = new int[_nodeCounter];
  517. _treeTraversalIndex = 0;
  518. _currentTraverseForm = (int)TreeTraversalForm.DFSinorder;
  519. }
  520.  
  521.  
  522. if (root.left != null)
  523. Inorder(root.left);
  524.  
  525. _treeTraversal[_treeTraversalIndex] = root.value;
  526. _treeTraversalIndex++;
  527.  
  528. if (root.right != null)
  529. Inorder(root.right);
  530. }
  531.  
  532. /// <summary>
  533. /// Creates DFS - Post-order traverse and stors it in _treeTraversal
  534. /// </summary>
  535. /// <param name="root"></param>
  536. void Postorder(Node root = null)
  537. {
  538. if (root == null)
  539. {
  540. root = _root;
  541. _treeTraversal = new int[_nodeCounter];
  542. _treeTraversalIndex = 0;
  543. _currentTraverseForm = (int)TreeTraversalForm.DFSpostorder;
  544. }
  545.  
  546.  
  547. if (root.left != null)
  548. Postorder(root.left);
  549.  
  550. if (root.right != null)
  551. Postorder(root.right);
  552.  
  553. _treeTraversal[_treeTraversalIndex] = root.value;
  554. _treeTraversalIndex++;
  555. }
  556.  
  557. /// <summary>
  558. /// Creates DFS - Out-order traverse and stors it in _treeTraversal
  559. /// </summary>
  560. /// <param name="root"></param>
  561. void Outorder(Node root = null)
  562. {
  563. if (root == null)
  564. {
  565. root = _root;
  566. _treeTraversal = new int[_nodeCounter];
  567. _treeTraversalIndex = 0;
  568. _currentTraverseForm = (int)TreeTraversalForm.DFSoutorder;
  569. }
  570.  
  571.  
  572. if (root.right != null)
  573. Outorder(root.right);
  574.  
  575. _treeTraversal[_treeTraversalIndex] = root.value;
  576. _treeTraversalIndex++;
  577.  
  578. if (root.left != null)
  579. Outorder(root.left);
  580.  
  581. }
  582.  
  583. /// <summary>
  584. /// Creates BFS - BreathFirstSearch traverse and stors it in _treeTraversal
  585. /// </summary>
  586. /// <param name="root"></param>
  587. void BreathFirstSearch(Node root = null)
  588. {
  589. if (root == null)
  590. {
  591. root = _root;
  592. _treeTraversal = new int[_nodeCounter];
  593. _treeTraversalIndex = 0;
  594. _currentTraverseForm = (int)TreeTraversalForm.BreathFirstSearch;
  595.  
  596. _treeTraversal[_treeTraversalIndex] = root.value;
  597. _treeTraversalIndex++;
  598. }
  599.  
  600.  
  601.  
  602. if (root.left != null)
  603. {
  604. _treeTraversal[_treeTraversalIndex] = root.left.value;
  605. _treeTraversalIndex++;
  606. }
  607.  
  608. if (root.right != null)
  609. {
  610. _treeTraversal[_treeTraversalIndex] = root.right.value;
  611. _treeTraversalIndex++;
  612. }
  613.  
  614. if (root.left != null)
  615. BreathFirstSearch(root.left);
  616. if (root.right != null)
  617. BreathFirstSearch(root.right);
  618. }
  619. }
  620. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement