Ejemplo n.º 1
0
    private IntervalBSTNode <TKey> Insert(IntervalBSTNode <TKey> node, TKey data, TKey end)
    {
        if (node == null)
        {
            var tmp = new IntervalBSTNode <TKey>(data, end);
            tmp.left = tmp.right = null;
            tmp.max  = end;
            return(tmp);
        }

        var cmp = node.key.CompareTo(data);

        if (cmp >= 0)
        {
            node.left = Insert(node.left, data, end);
        }
        else
        {
            node.right = Insert(node.right, data, end);
        }
        if (node.max.CompareTo(end) < 0)
        {
            node.max = end;
        }
        return(node);
    }
Ejemplo n.º 2
0
    private void DoRangeTest(IntervalBSTNode <TKey> node, TKey start, TKey end, List <IntervalBSTNode <TKey> > results)
    {
        if (node == null)
        {
            return;
        }

        var cmp    = node.key.CompareTo(start);
        var cmpEnd = node.end.CompareTo(start);
        var cmpMax = node.max.CompareTo(start);

        Console.WriteLine($"TestNode::{node.key}::{node.end}::max:{node.max}");
        if (!(end.CompareTo(node.key) < 0 || node.end.CompareTo(start) < 0))
        {
            results.Add(node);
        }

        // If left child of root is present and max of left child is
        // greater than or equal to given interval, then i may
        // overlap with an interval is left subtree
        if (node.left != null && node.left.max.CompareTo(start) >= 0)
        {
            DoRangeTest(node.left, start, end, results);
        }

        if (cmp < 0 || end.CompareTo(node.key) > 0)
        {
            DoRangeTest(node.right, start, end, results);
        }
    }
Ejemplo n.º 3
0
    private void DoStableTest(IntervalBSTNode <TKey> node, TKey val, List <IntervalBSTNode <TKey> > results)
    {
        if (node == null)
        {
            return;
        }

        var cmp    = node.key.CompareTo(val);
        var cmpEnd = node.end.CompareTo(val);
        var cmpMax = node.max.CompareTo(val);

        Console.WriteLine($"TestNode::{node.key}::{node.end}::max:{node.max}");
        if (cmp <= 0 && cmpEnd > 0)
        {
            results.Add(node);
        }
        if (cmpMax < 0)
        {
            return;
        }

        if (cmp >= 0 || cmpMax > 0)
        {
            DoStableTest(node.left, val, results);
        }

        if (cmp < 0)
        {
            DoStableTest(node.right, val, results);
        }
    }
Ejemplo n.º 4
0
 public void Insert(TKey value, TKey end)
 {
     if (root_ == null)
     {
         root_     = new IntervalBSTNode <TKey>(value, end);
         root_.max = end;
     }
     else
     {
         Insert(root_, value, end);
     }
 }
Ejemplo n.º 5
0
 public IntervalTree()
 {
     this.root_ = null;
 }
Ejemplo n.º 6
0
 public IntervalBSTNode(T ele, T end, IntervalBSTNode <T> left, IntervalBSTNode <T> right)
 {
     this.key = ele; this.end = end; this.left = left; this.right = right;
 }