using System.Collections.Generic;
public static void Main()
Console.WriteLine("Hello World");
var solution = new Solution();
Console.WriteLine(string.Join(",", solution.GetIntervals()));
Console.WriteLine(string.Join(",", solution.GetIntervals()));
Console.WriteLine(string.Join(",", solution.GetIntervals()));
Console.WriteLine(string.Join(",", solution.GetIntervals()));
Console.WriteLine(string.Join(",", solution.GetIntervals()));
Console.WriteLine(string.Join(",", solution.GetIntervals()));
Console.WriteLine(string.Join(",", solution.GetIntervals()));
public void AddNum(int val)
var node = _tree.Find(val);
var left = _tree.FindPrev(val);
var right = _tree.FindNext(val);
if (left != null && right != null && left.val.end == val -1 && right.val.start == val + 1)
left.val.end = right.val.end;
else if (left != null && left.val.end + 1 >= val)
left.val.end = Math.Max(val, left.val.end);
else if (right != null && right.val.start - 1 == val)
_tree.Add(val, new Interval(val, right.val.end));
_tree.Add(val, new Interval(val, val));
public List<Interval> GetIntervals()
public Node(int key, Interval val)
public Interval(int s, int e)
public override string ToString()
return string.Format("[{0}, {1}] ", start, end);
public List<Interval> Values()
var ans = new List<Interval>();
var stack = new Stack<Node>();
while (stack.Count > 0 || node != null)
public void Add(int key, Interval val)
_root = Add(_root, key, val);
private Node Add(Node node, int key, Interval val)
return new Node(key, val);
node.right = Add(node.right, key, val);
node.left = Add(node.left, key, val);
public Node FindPrev(int key)
return FindPrev(_root, key);
private Node FindPrev(Node node, int key)
return FindPrev(node.left, key);
return FindPrev(node.right, key) ?? node;
public Node FindNext(int key)
return FindNext(_root, key);
private Node FindNext(Node node, int key)
return FindNext(node.right, key);
return FindNext(node.left, key) ?? node;
public Node Find(int key)
private Node Del(Node node, int key)
node.right = Del(node.right, key);
node.left = Del(node.left, key);
else if (node.right == null)
var min = DelMin(node.right);
private Node DelMin(Node node)
while (node.left != null)
parent.left = node.right;