Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
136
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.03 KB | None | 0 0
  1.  
  2. #include <cstdlib>
  3. #include <iostream>
  4. #include <fstream>
  5. #include <vector>
  6. #include <stack>
  7.  
  8. struct Segment
  9. {
  10. Segment(int left, int right)
  11. : left_(left), right_(right)
  12. {}
  13.  
  14. int left(void) const { return left_; }
  15. int right(void) const { return right_; }
  16.  
  17. void set(int left, int right) { left_ = left; right_ = right; }
  18.  
  19. private:
  20. int left_;
  21. int right_;
  22. };
  23.  
  24. struct SegmentTreeNode
  25. {
  26. explicit SegmentTreeNode(Segment segment, SegmentTreeNode *leftPtr = NULL, SegmentTreeNode *rightPtr = NULL)
  27. :segment_(segment), maxRight_(segment.right()) , left_(leftPtr), right_(rightPtr)
  28. {}
  29.  
  30. Segment segment() const { return segment_; }
  31. int maxRight() const { return maxRight_; }
  32.  
  33. struct SegmentTreeNode *&left() { return left_; }
  34. struct SegmentTreeNode *&right() { return right_; }
  35. void setMaxRight(int r) { maxRight_ = r; }
  36.  
  37. void setLeft(struct SegmentTreeNode *left) { left_ = left; }
  38. void setRight(struct SegmentTreeNode *right) { right_ = right; }
  39.  
  40. int key() { return segment_.left(); }
  41.  
  42. void setSegment(Segment s) { segment_ = s; }
  43.  
  44. private:
  45. Segment segment_;
  46. int maxRight_;
  47. struct SegmentTreeNode *left_;
  48. struct SegmentTreeNode *right_;
  49. };
  50.  
  51. struct SegmentTree
  52. {
  53. SegmentTree(SegmentTreeNode *root)
  54. {
  55. root_ = root;
  56. }
  57.  
  58. SegmentTreeNode *&getRoot() { return root_; }
  59.  
  60. void add(Segment seg);
  61. bool del(Segment seg);
  62. SegmentTreeNode *find(Segment seg);
  63.  
  64. void intersect(Segment seg, std::vector<Segment> &intersects);
  65.  
  66. private:
  67. SegmentTreeNode *root_;
  68. };
  69.  
  70. int main(void)
  71. {
  72. char *fileName = "test.txt";
  73.  
  74. std::ifstream in(fileName);
  75.  
  76. SegmentTree tree(NULL);
  77.  
  78. size_t treeSize = 0;
  79. in » treeSize;
  80.  
  81. for (size_t i = 0; i < treeSize; ++i)
  82. {
  83. int u = 0;
  84. int v = 0;
  85.  
  86. in » u » v;
  87.  
  88. tree.add(Segment(u, v));
  89. }
  90.  
  91. std::vector<Segment> intersects;
  92.  
  93. tree.intersect(Segment(-42, -40), intersects);
  94.  
  95. std::cout « intersects.size() « std::endl;
  96.  
  97. if (tree.del(Segment(-40, 20)))
  98. {
  99. std::cout « "Delete of the segment was complete\n";
  100. std::cout « tree.getRoot()->maxRight() « std::endl;
  101. }
  102.  
  103. return 0;
  104. }
  105.  
  106. void SegmentTree::add(Segment seg)
  107. {
  108. const int minVal = -1000000;
  109.  
  110. SegmentTreeNode *newNode = new SegmentTreeNode(seg);
  111. SegmentTreeNode *curNode = root_;
  112. SegmentTreeNode *parentNode = curNode;
  113. bool toLeft = true;
  114.  
  115. if (root_ == NULL)
  116. {
  117. root_ = newNode;
  118. return;
  119. }
  120.  
  121. while (curNode != NULL)
  122. {
  123. int v1 = minVal;
  124. int v2 = minVal;
  125.  
  126. curNode->setMaxRight(std::max(newNode->maxRight(), curNode->maxRight()));
  127.  
  128. if (newNode->key() <= curNode->key())
  129. {
  130. parentNode = curNode;
  131. curNode = curNode->left();
  132.  
  133. toLeft = true;
  134. } else
  135. {
  136. parentNode = curNode;
  137. curNode = curNode->right();
  138.  
  139. toLeft = false;
  140. }
  141. }
  142.  
  143. if (toLeft)
  144. {
  145. parentNode->setLeft(newNode);
  146. } else
  147. {
  148. parentNode->setRight(newNode);
  149. }
  150. }
  151.  
  152. bool SegmentTree::del(Segment seg)
  153. {
  154. const int minVal = -1000000;
  155.  
  156. std::stack<SegmentTreeNode *> st;
  157.  
  158. SegmentTreeNode *node = root_;
  159.  
  160. while (node != NULL && ( node->segment().left() != seg.left() || node->segment().right() != seg.right() ))
  161. {
  162. st.push(node);
  163.  
  164. if (seg.left() <= node->key())
  165. {
  166. node = node->left();
  167. } else
  168. {
  169. node = node->right();
  170. }
  171. }
  172.  
  173. if (node == NULL)
  174. {
  175. return false;
  176. } else
  177. {
  178. SegmentTreeNode *replaceNode = node;
  179.  
  180. std::cout « replaceNode->segment().right() « std::endl;
  181.  
  182. while (node->right() != NULL)
  183. {
  184. st.push(node);
  185. node = node->right();
  186. }
  187.  
  188. std::cout « replaceNode->segment().right() « std::endl;
  189.  
  190. //Node points to vertex, which we must delete
  191. replaceNode->segment().set(node->segment().left(), node->segment().right());
  192. replaceNode->setMaxRight(node->segment().right());
  193.  
  194. int counter = 0;
  195. SegmentTreeNode * deleteNode = node;
  196.  
  197. while (!st.empty())
  198. {
  199. node = st.top();
  200. st.pop();
  201.  
  202. if (counter == 0)
  203. {
  204. ++counter;
  205. if (node->left() == deleteNode)
  206. node->setLeft(NULL);
  207. else
  208. node->setRight(NULL);
  209.  
  210. delete deleteNode;
  211. }
  212.  
  213. int v1 = minVal;
  214. int v2 = minVal;
  215.  
  216. if (node->left() != NULL)
  217. v1 = node->left()->maxRight();
  218. if (node->right() != NULL)
  219. v2 = node->right()->maxRight();
  220. 04:41:09   
  221. node->setMaxRight( std::max(node->segment().right(), (v1 > v2) ? v1 : v2) );
  222. }
  223.  
  224. return true;
  225. }
  226. }
  227.  
  228. SegmentTreeNode *SegmentTree::find(Segment seg)
  229. {
  230. SegmentTreeNode *node = root_;
  231.  
  232. while (node != NULL && ( node->segment().left() != seg.left() || node->segment().right() != seg.right() ))
  233. {
  234. if (seg.left() <= node->key())
  235. node = node->left();
  236. else
  237. node = node->right();
  238. }
  239.  
  240. return node;
  241. }
  242.  
  243. void SegmentTree::intersect(Segment seg, std::vector<Segment> &intersects)
  244. {
  245. std::stack<SegmentTreeNode *> st;
  246. SegmentTreeNode *node = root_;
  247.  
  248. st.push(node);
  249.  
  250. while (!st.empty())
  251. {
  252. node = st.top();
  253. st.pop();
  254.  
  255. while (node != NULL && (seg.right() < node->segment().left() || seg.left() > node->segment().right()))
  256. {
  257. if (node->right() != NULL && node->right()->maxRight() >= seg.left())
  258. st.push(node->right());
  259.  
  260. if (node->left() != NULL && node->left()->maxRight() >= seg.left())
  261. {
  262. node = node->left();
  263. } else
  264. {
  265. node = node->right();
  266. }
  267. }
  268.  
  269. if (node != NULL)
  270. {
  271. st.push(node->left());
  272. st.push(node->right());
  273.  
  274. intersects.push_back(node->segment());
  275. }
  276. }
  277. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement