using System.Collections.Generic;
public void add(int val){
public node next(int v) {
public override string ToString() => val.ToString();
private static IEnumerable<int> search(node root, int min, int max) {
HashSet<int> vals = new HashSet<int>();
node splitN = splitNode(root, min, max, vals);
LinkedList<node> minNodes = new LinkedList<node>();
LinkedList<node> maxNodes = new LinkedList<node>();
traverse(splitN, min, minNodes);
traverse(splitN, max, maxNodes);
Console.WriteLine("splitN null");
foreach(var n in minNodes) {
foreach(var n in maxNodes) {
print(minNodes.Select(x=>x.val));
private static void addVals(node n, ISet<int> vals){
private static void traverse(node n, int v, LinkedList<node> nodes){
private static node splitNode(node n, int min, int max, ISet<int> vals){
if(n.val >= min && n.val <= max)
Console.WriteLine(n + " | " + nA + " | " + nB);
return splitNode(nA, min, max, vals);
private static void print(IEnumerable<int> vals){
public static void Main()
Random rnd = new Random();
var vals = new HashSet<int>();
int v = rnd.Next(0, 100);
var inRange = new HashSet<int>();
var inRange2 = search(root, min, max);
Console.WriteLine("====");
print(inRange.OrderBy(x=>x));
print(inRange2.OrderBy(x=>x));