/// <summary> /// Tests the tree if can be connected. /// </summary> /// <param name="NodeToWhichWeConnectsTheTreeValue">The node to which we connects the tree value.</param> /// <param name="NodeToWhichWeConnectsTheTreeConnectorNumer">The node to which we connects the tree connector numer.</param> /// <param name="TreeToBeConnected">The tree to be connected.</param> /// <param name="TreeToBeConnectedConnectorNumer">The tree to be connected connector numer.</param> /// <returns></returns> public bool TestTreeIfCanBeConnected(T NodeToWhichWeConnectsTheTreeValue, int NodeToWhichWeConnectsTheTreeConnectorNumer, SortedTree <T> TreeToBeConnected, int TreeToBeConnectedConnectorNumer) { SortedTreeNode NodeToWhichWeConnects = GetNode(NodeToWhichWeConnectsTheTreeValue); if (NodeToWhichWeConnects == null) { return(false); } if (NodeToWhichWeConnects.GetChildNodes().ContainsKey(NodeToWhichWeConnectsTheTreeConnectorNumer)) { return(false); } if (TreeToBeConnected.GetRoots().Count > 1) { return(false); } foreach (T nodevalue in TreeToBeConnected) { if (GetNode(nodevalue) != null) { return(false); } } return(true); }
/// <summary> /// Gets the subtree from node. /// </summary> /// <param name="StartValue">The start value.</param> public SortedTree <T> GetSubtreeFromNode(T StartValue) { SortedTree <T> TreeToBeReturned = (SortedTree <T>)((ICloneable)this).Clone(); TreeToBeReturned.MoveNodeToRoots(StartValue); // no we have to remove other roots int idx = 0; SortedTreeNodeList nodelist = TreeToBeReturned.GetRoots(); while (nodelist.Count > 1) { if (!nodelist[idx].Value.Equals(StartValue)) { TreeToBeReturned.RemoveValue(nodelist[idx].Value, false); } else { idx++; } nodelist = TreeToBeReturned.GetRoots(); } return(TreeToBeReturned); }
/// <summary> /// Connects the tree to the node. /// </summary> /// <param name="NodeToWhichWeConnectsTheTreeValue">The node to which we connects the tree value.</param> /// <param name="NodeToWhichWeConnectsTheTreeConnectorNumer">The node to which we connects the tree connector numer.</param> /// <param name="TreeToBeConnected">The tree to be connected.</param> /// <param name="TreeToBeConnectedConnectorNumer">The tree to be connected connector numer.</param> public void ConnectTheTreeToTheNode(T NodeToWhichWeConnectsTheTreeValue, int NodeToWhichWeConnectsTheTreeConnectorNumer, SortedTree <T> TreeToBeConnected, int TreeToBeConnectedConnectorNumer) { //sprawdzamy czy polaczenie moze nastapic if (!TestTreeIfCanBeConnected(NodeToWhichWeConnectsTheTreeValue, NodeToWhichWeConnectsTheTreeConnectorNumer, TreeToBeConnected, TreeToBeConnectedConnectorNumer)) { throw new SortedTreeNodeException("Cannot connect such tree"); } //wyszukujemy node do ktorego chcemy podlaczyc drzewo SortedTreeNode NodeToWhichWeConnectsTheTree = GetNode(NodeToWhichWeConnectsTheTreeValue); if (NodeToWhichWeConnectsTheTree == null) { throw new SortedTreeNodeException("Cannot find parent node"); } //klonujemy drzewo ktore dolaczamy aby uniknac ew. zmian w tym drzewie (chcemy miec pewnosc ze ktos zmieniajac oryginal to drzewo (this) pozostanie nie zmienione) SortedTree <T> clonnedtree = (SortedTree <T>)((ICloneable)TreeToBeConnected).Clone(); clonnedtree.SetParentTree(this); NodeToWhichWeConnectsTheTree.AddNode(clonnedtree.GetRoots()[0], NodeToWhichWeConnectsTheTreeConnectorNumer, TreeToBeConnectedConnectorNumer); ParentCleanup(); }