Beispiel #1
0
 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;
 }
Beispiel #2
0
        public IPakiraNode GetLeftNodeSafe(IPakiraNode node)
        {
            IPakiraNode leftNode;

            leftNodes.TryGetValue(node, out leftNode);

            return(leftNode);
        }
Beispiel #3
0
 public bool IsLeaf(IPakiraNode node)
 {
     if (leftNodes.ContainsKey(node))
     {
         rightNodes.ContainsKey(node).ShouldBeTrue();
         return(false);
     }
     else
     {
         return(true);
     }
 }
Beispiel #4
0
        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));
            }
        }
Beispiel #5
0
 public IPakiraNode GetParentNode(IPakiraNode node)
 {
     return(parentNodes[node]);
 }
Beispiel #6
0
 public IPakiraNode GetRightNode(IPakiraNode node)
 {
     return(rightNodes[node]);
 }
Beispiel #7
0
 public IPakiraNode GetLeftNode(IPakiraNode node)
 {
     return(leftNodes[node]);
 }