示例#1
0
        BinaryNode <T> GetParentNode(BinaryNode <T> nodeToFind, BinaryNode <T> currentNode, BinaryNode <T> parentNode)
        {
            if (currentNode == null)
            {
                return(null);
            }
            else if (currentNode.Equals(nodeToFind))
            {
                return(parentNode);
            }

            var intComparison = nodeToFind.Value.CompareTo(currentNode.Value);

            switch (intComparison)
            {
            case (0):
            case (-1):
                return(GetParentNode(nodeToFind, currentNode.Left, currentNode));

            case (1):
                return(GetParentNode(nodeToFind, currentNode.Right, currentNode));

            default:
                return(null);
            }
        }
示例#2
0
        void Remove(BinaryNode <T> currentNode, BinaryNode <T> parentNode)
        {
            if (currentNode == null)
            {
                return;
            }

            if (currentNode.Right != null)
            {
                var leftMostNode       = FindLeftMostNode(currentNode.Right);
                var leftMostNodeParent = GetParentNode(leftMostNode);

                currentNode.Value = leftMostNode.Value;

                if (leftMostNodeParent != null && leftMostNode.Right == null)
                {
                    if (leftMostNodeParent.Equals(currentNode))
                    {
                        leftMostNodeParent.Right = null;
                    }
                    else
                    {
                        leftMostNodeParent.Left = null;
                    }
                }
                else
                {
                    Remove(leftMostNode, leftMostNodeParent);
                }
            }

            else if (currentNode.Left != null)
            {
                var leftChildValue = currentNode.Left.Value;
                Remove(currentNode.Left, currentNode);
                currentNode.Value = leftChildValue;
            }
            else
            {
                if (currentNode.Equals(Root))
                {
                    Root = null;
                    return;
                }
                var compareInt = currentNode.Value.CompareTo(parentNode.Value);
                switch (compareInt)
                {
                case (0):
                case (-1):
                    parentNode.Left = null;
                    return;

                case (1):
                    parentNode.Right = null;
                    return;

                default:
                    return;
                }
            }
        }