Пример #1
0
        public CommandResult AddNode(string newNode, BinaryChildrenEnum binaryChildrenEnum)
        {
            var createTreeResult = Tree.Create(newNode);

            if (createTreeResult.IsFailure)
            {
                return(CommandResult.Failure(createTreeResult.FailureMessage));
            }

            return(this.OverrideNode(createTreeResult.Result, binaryChildrenEnum));
        }
        protected virtual CommandResult ProcessChild(Dictionary <string, Tree> subtreesDictionary, string key, Tree root,
                                                     BinaryChildrenEnum childrenEnum)
        {
            if (key == SpecialIndicators.NullNodeIndicator)
            {
                return(CommandResult.Ok());
            }

            var dictionaryResult = GetFromDictionaryOrAdd(subtreesDictionary, key);

            if (dictionaryResult.IsFailure)
            {
                return(CommandResult.Failure(dictionaryResult.FailureMessage));
            }

            return(root.OverrideNode(dictionaryResult.Result, childrenEnum));
        }
Пример #3
0
        public CommandResult OverrideNode(Tree newNode, BinaryChildrenEnum binaryChildrenEnum)
        {
            if (newNode.Parent != null)
            {
                if (newNode.Parent != this)
                {
                    var failure = string.Format(TreeMessages.CannotSpecifyChildBecauseItAlreadyHasParent,
                                                this.Data, nameof(binaryChildrenEnum), newNode.Data, newNode.Parent.Data);

                    CommandResult.Failure(failure);
                }
                else
                {
                    if (binaryChildrenEnum == BinaryChildrenEnum.Left && this.Right == newNode ||
                        binaryChildrenEnum == BinaryChildrenEnum.Right && this.Left == newNode)
                    {
                        CommandResult.Failure(TreeMessages.CannotAddReferenceTwice);
                    }
                }
            }
            else
            {
                newNode.Parent = this;
            }

            if (binaryChildrenEnum == BinaryChildrenEnum.Left)
            {
                this.Left = newNode;
            }

            if (binaryChildrenEnum == BinaryChildrenEnum.Right)
            {
                this.Right = newNode;
            }

            return(CommandResult.Ok());
        }