private void RbTreeRightRotate(RbTreeNode nodeY) { var nodeX = nodeY.Left; nodeY.Left = nodeX.Right; if (nodeX.Right != null) { nodeX.Right.Parent = nodeY; } nodeX.Parent = nodeY.Parent; if (nodeY.Parent == null) { _rbTreeRoot = nodeX; } else if (nodeY == nodeY.Parent.Right) { nodeY.Parent.Right = nodeX; } else if (nodeY == nodeY.Parent.Left) { nodeY.Parent.Left = nodeX; } nodeX.Right = nodeY; nodeY.Parent = nodeX; }
/// <summary> /// Creates a node from field values. /// </summary> public RbTreeNode(object val, RbTreeNode parent, RbTreeNode left, RbTreeNode right, bool isRed) { Value = val; Parent = parent; Left = left; Right = right; IsRed = isRed; }
private void RbTreeInsertFixUp(RbTreeNode item) { while (item != _rbTreeRoot && item.Parent.Colour == RbTreeColor.Red) { if (item.Parent == item.Parent.Parent.Left) { var nodeY = item.Parent.Parent.Right; if (nodeY is { Colour : RbTreeColor.Red })
public bool MoveNext() { if (_currentNode == null) { _currentNode = _tree.First; } else { _currentNode = _tree.Next(_currentNode); } return !_currentNode.IsNull; }
public bool MoveNext() { if (_currentNode == null) { _currentNode = _tree.First; } else { _currentNode = _tree.Next(_currentNode); } return(!_currentNode.IsNull); }
private void RbTreeInsert(int item) { var newItem = new RbTreeNode(item); if (_rbTreeRoot == null) { _rbTreeRoot = newItem; _rbTreeRoot.Colour = RbTreeColor.Black; } else { RbTreeNode?nodeY = null; var nodeX = _rbTreeRoot; while (nodeX != null) { nodeY = nodeX; nodeX = newItem.Data < nodeX.Data ? nodeX.Left : nodeX.Right; } newItem.Parent = nodeY; if (nodeY == null) { _rbTreeRoot = newItem; } else if (newItem.Data < nodeY.Data) { nodeY.Left = newItem; } else { nodeY.Right = newItem; } newItem.Left = null; newItem.Right = null; newItem.Colour = RbTreeColor.Red; RbTreeInsertFixUp(newItem); } }
public void Reset() { _currentNode = null; }