public void Add() { AndersonTree <int, int> tree = new AndersonTree <int, int>(); tree.Add(0, 0); tree.Add(1, 1); // split must perform a left rotation and increase // the level of the node with key 1. tree.Add(2, 2); AndersonTreeNode <int, int> node = tree.FindNode(1); Assert.AreEqual(node.Level, 2); Assert.AreEqual(node.Left.Level, 1); Assert.AreEqual(node.Right.Level, 1); Assert.AreEqual(node.Left.Value, 0); Assert.AreEqual(node.Right.Value, 2); tree.Add(3, 3); tree.Add(4, 4); tree.Add(5, 5); tree.Add(6, 6); // must be balanced node = tree.FindNode(3); Assert.AreEqual(node.Value, 3); Assert.AreEqual(node.Left.Value, 1); Assert.AreEqual(node.Left.Left.Value, 0); Assert.AreEqual(node.Left.Right.Value, 2); Assert.AreEqual(node.Right.Value, 5); Assert.AreEqual(node.Right.Left.Value, 4); Assert.AreEqual(node.Right.Right.Value, 6); Assert.IsTrue(tree.ContainsKey(0)); Assert.IsTrue(tree.ContainsKey(1)); Assert.IsFalse(tree.ContainsKey(10)); Assert.IsNotNull(tree[4]); Assert.Throws(typeof(KeyNotFoundException), delegate() { int v = tree[10]; }); Assert.Throws(typeof(ArgumentException), delegate() { tree.Add(0, 0); }); // set value Assert.DoesNotThrow(delegate() { tree[0] = 20; }); int i = tree[0]; Assert.AreEqual(i, 20); }
public void Remove() { AndersonTree <int, int> tree = new AndersonTree <int, int>(); tree.Add(0, 0); tree.Add(1, 1); tree.Add(2, 2); tree.Add(3, 3); tree.Add(4, 4); tree.Add(5, 5); tree.Add(6, 6); tree.Add(7, 7); // removing zero will cause a break in the levels between 1 and nil, // so the level of 1 is decreased to 1. Then break is between 1 and 3, // so the level of 3 is decreased to 2. tree.Remove(0); AndersonTreeNode <int, int> node = tree.FindNode(3); // levels Assert.AreEqual(node.Level, 2); Assert.AreEqual(node.Left.Level, 1); Assert.AreEqual(node.Left.Right.Level, 1); Assert.AreEqual(node.Right.Level, 2); Assert.AreEqual(node.Right.Left.Level, 1); Assert.AreEqual(node.Right.Right.Level, 1); // values Assert.AreEqual(node.Value, 3); Assert.AreEqual(node.Left.Value, 1); Assert.AreEqual(node.Left.Right.Value, 2); Assert.AreEqual(node.Right.Value, 5); Assert.AreEqual(node.Right.Left.Value, 4); Assert.AreEqual(node.Right.Right.Value, 6); Assert.IsTrue(tree.Remove(1)); Assert.IsFalse(tree.ContainsKey(1)); Assert.Throws(typeof(KeyNotFoundException), delegate() { int val = tree[1]; }); // the real remove test node = tree.FindNode(3); // levels Assert.AreEqual(node.Level, 2); Assert.AreEqual(node.Left.Level, 1); Assert.AreEqual(node.Right.Level, 2); Assert.AreEqual(node.Right.Left.Level, 1); Assert.AreEqual(node.Right.Right.Level, 1); Assert.AreEqual(node.Right.Right.Right.Level, 1); // values Assert.AreEqual(node.Value, 3); Assert.AreEqual(node.Left.Value, 2); Assert.AreEqual(node.Right.Value, 5); Assert.AreEqual(node.Right.Left.Value, 4); Assert.AreEqual(node.Right.Right.Value, 6); Assert.AreEqual(node.Right.Right.Right.Value, 7); }