private PakiraTree(IPakiraNode root, ImmutableDictionary <IPakiraNode, IPakiraNode> leftNodes, ImmutableDictionary <IPakiraNode, IPakiraNode> rightNodes, ImmutableDictionary <IPakiraNode, IPakiraNode> parentNodes) { Root = root; this.leftNodes = leftNodes; this.rightNodes = rightNodes; this.parentNodes = parentNodes; }
public IPakiraNode GetLeftNodeSafe(IPakiraNode node) { IPakiraNode leftNode; leftNodes.TryGetValue(node, out leftNode); return(leftNode); }
public bool IsLeaf(IPakiraNode node) { if (leftNodes.ContainsKey(node)) { rightNodes.ContainsKey(node).ShouldBeTrue(); return(false); } else { return(true); } }
public PakiraTree ReplaceLeaf(PakiraLeaf leaf, PakiraTree pakiraTree) { IPakiraNode leafParent = GetParentNode(leaf); // The current pakira tree only has a leaf as root if (leafParent == null) { leaf.ShouldBe(Root); return(pakiraTree); } else { ImmutableDictionary <IPakiraNode, IPakiraNode> updatedLeftNodes; ImmutableDictionary <IPakiraNode, IPakiraNode> updatedRightNodes; ImmutableDictionary <IPakiraNode, IPakiraNode> updatedParentNodes; if (leftNodes.Contains(leafParent, leaf)) { updatedLeftNodes = leftNodes.Remove(leafParent); updatedRightNodes = rightNodes; updatedLeftNodes = updatedLeftNodes.Add(leafParent, pakiraTree.Root); } else { rightNodes.ShouldContainKeyAndValue(leafParent, leaf); updatedLeftNodes = leftNodes; updatedRightNodes = rightNodes.Remove(leafParent); updatedRightNodes = updatedRightNodes.Add(leafParent, pakiraTree.Root); } updatedLeftNodes = updatedLeftNodes.AddRange(pakiraTree.leftNodes); updatedRightNodes = updatedRightNodes.AddRange(pakiraTree.rightNodes); updatedParentNodes = parentNodes.Remove(leaf); updatedParentNodes = updatedParentNodes.Add(pakiraTree.Root, leafParent); updatedParentNodes = updatedParentNodes.AddRange(pakiraTree.parentNodes); return(new PakiraTree(Root, updatedLeftNodes, updatedRightNodes, updatedParentNodes)); } }
public IPakiraNode GetParentNode(IPakiraNode node) { return(parentNodes[node]); }
public IPakiraNode GetRightNode(IPakiraNode node) { return(rightNodes[node]); }
public IPakiraNode GetLeftNode(IPakiraNode node) { return(leftNodes[node]); }