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)); }
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()); }