Advertisement
absolute100

interval tree solution merge intervals

Jan 22nd, 2017
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.74 KB | None | 0 0
  1. class IntervalTree{
  2. public:
  3.     int middle;
  4.     int start, end;
  5.     IntervalTree *left, *right;
  6.     IntervalTree(int s, int e): start(s), end(e), middle((s+e)/2){
  7.         this->left=this->right=NULL;
  8.     }
  9. };
  10.  
  11. void InsertInterval(IntervalTree *node, Interval ¤tInterval){
  12.     if(node == NULL)
  13.         return;
  14.  
  15.     if(currentInterval.end<node->middle){
  16.         if(node->left)
  17.             return InsertInterval(node->left, currentInterval);
  18.         else{
  19.             IntervalTree *newnode = new IntervalTree(currentInterval.start, currentInterval.end);
  20.             node->left = newnode;
  21.             return;
  22.         }
  23.     }
  24.  
  25.     if(currentInterval.start>node->middle){
  26.         if(node->right)
  27.             return InsertInterval(node->right, currentInterval);
  28.         else{
  29.             IntervalTree *newnode = new IntervalTree(currentInterval.start, currentInterval.end);
  30.             node->right = newnode;
  31.             return;
  32.         }
  33.     }
  34.  
  35.     //insert it to current node
  36.     node->start=min(node->start, currentInterval.start);
  37.     node->end=max(node->end, currentInterval.end);
  38. }
  39.  
  40. So, when you want to merge the intervals, you will do something like below:
  41.  
  42. void QueryInterval(vector<Interval> &retV, IntervalTree *node){
  43.     //retV is the return vector
  44.     vector<Interval> leftIntervals;
  45.     vector<Interval> rightIntervals;
  46.  
  47.     bool mergeleft = false; //whether current node merge with any intervals from left child.
  48.     if(node->left){
  49.         //return the merge of all intervals in left child.
  50.         QueryInterval(leftIntervals, node->left);
  51.         //merge left interval with myself.
  52.         MergeLeftInterval(leftIntervals, node, retV, mergeleft);
  53.     }
  54.  
  55.     if(!mergeleft){ //if we did not merge left intervals, add a new one
  56.         Interval newinterval;
  57.         newinterval.start = node->start;
  58.         newinterval.end = node->end;
  59.         retV.push_back(newinterval);
  60.     }
  61.  
  62.     if(node->right){
  63.         QueryInterval(rightIntervals, node->right);
  64.         MergeRightInterval(rightIntervals, node, retV);
  65.     }
  66.  
  67.     return;
  68. }
  69.  
  70. void MergeLeftInterval(vector<Interval> &leftIntervals, IntervalTree *node, vector<Interval> &retV, bool &merged){
  71.     for(int i=0; i<leftIntervals.size(); i++){
  72.         if(leftIntervals[i].end>=node->start){
  73.             Interval newinterval;
  74.             newinterval.start = min(leftIntervals[i].start, node->start);
  75.             newinterval.end = node->end;
  76.             retV.push_back(newinterval);
  77.             merged = true;
  78.             break;
  79.         } else {
  80.             retV.push_back(leftIntervals[i]);
  81.         }
  82.     }
  83. }
  84.  
  85. void MergeRightInterval(vector<Interval> &rightIntervals, IntervalTree *node, vector<Interval> &retV){
  86.     for(int i=0; i<rightIntervals.size(); i++){
  87.         if(rightIntervals[i].start<=node->end){
  88.             retV[retV.size()-1].end = max(rightIntervals[i].end, node->end);
  89.         } else{
  90.             retV.push_back(rightIntervals[i]);
  91.         }
  92.     }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement