/// <summary> /// Inserts the specified value. /// </summary> /// <param name="value">The value.</param> /// <param name="pointer">The pointer.</param> public void Insert(long value, DataPointer pointer) { if (Root == null) { Count++; Root = new KeyNode { Value = value, Pointer = pointer }; return; } var freeNode = SeekFreeNode(value); if (freeNode.Value.Equals(value)) { throw new DuplicateKeyException(); } if (value < freeNode.Value) { Count++; freeNode.Left = new KeyNode { Parent = freeNode, Pointer = pointer, Value = value }; Save(); return; } Count++; freeNode.Right = new KeyNode { Parent = freeNode, Pointer = pointer, Value = value }; Save(); }
/// <summary> /// Seeks the free node. /// </summary> /// <param name="value">The value.</param> /// <param name="from">From.</param> /// <returns>KeyNode.</returns> private KeyNode SeekFreeNode(long value, KeyNode from = null) { var node = from ?? Root; if (node.Value.Equals(value)) { return(node); } var seek = node; while (seek != null) { if (seek.Value.Equals(value)) { return(seek); } if (seek.Left == null && value < seek.Value) { return(seek); } if (seek.Right == null && value > seek.Value) { return(seek); } if (value < seek.Value) { seek = seek.Left; continue; } if (value > seek.Value) { seek = seek.Right; } } return(null); }
/// <summary> /// Seeks the node. /// </summary> /// <param name="node">The node.</param> /// <param name="value">The value.</param> /// <returns>KeyNode.</returns> public KeyNode SeekNode(KeyNode node, long value) { if (Root == null) { return(null); } if (node == null) { node = Root; } if (node.Value.Equals(value)) { return(node); } var seek = node; while (seek != null) { if (seek.Value.Equals(value)) { return(seek); } if (value < seek.Value) { seek = seek.Left; continue; } if (value > seek.Value) { seek = seek.Right; } } return(null); }
/// <summary> /// Seeks the free node. /// </summary> /// <param name="value">The value.</param> /// <param name="from">From.</param> /// <returns>KeyNode.</returns> private KeyNode SeekFreeNode(long value, KeyNode from = null) { var node = from ?? Root; if (node.Value.Equals(value)) return node; var seek = node; while (seek != null) { if (seek.Value.Equals(value)) return seek; if (seek.Left == null && value < seek.Value) return seek; if (seek.Right == null && value > seek.Value) return seek; if (value < seek.Value) { seek = seek.Left; continue; } if (value > seek.Value) seek = seek.Right; } return null; }
/// <summary> /// Seeks the node. /// </summary> /// <param name="node">The node.</param> /// <param name="value">The value.</param> /// <returns>KeyNode.</returns> public KeyNode SeekNode(KeyNode node, long value) { if (Root == null) return null; if (node == null) node = Root; if (node.Value.Equals(value)) return node; var seek = node; while (seek != null) { if (seek.Value.Equals(value)) return seek; if (value < seek.Value) { seek = seek.Left; continue; } if (value > seek.Value) seek = seek.Right; } return null; }
/// <summary> /// Inserts the specified value. /// </summary> /// <param name="value">The value.</param> /// <param name="pointer">The pointer.</param> public void Insert(long value, DataPointer pointer) { if (Root == null) { Count++; Root = new KeyNode {Value = value, Pointer = pointer}; return; } var freeNode = SeekFreeNode(value); if (freeNode.Value.Equals(value)) { throw new DuplicateKeyException(); } if (value < freeNode.Value) { Count++; freeNode.Left = new KeyNode {Parent = freeNode, Pointer = pointer, Value = value}; Save(); return; } Count++; freeNode.Right = new KeyNode {Parent = freeNode, Pointer = pointer, Value = value}; Save(); }