コード例 #1
0
ファイル: TreeTests.cs プロジェクト: JamesMenetrey/Tree.NET
        public void CollectionInitializerImplementation()
        {
            // Arrange
            var tree = new ValueTreeNode <string>("Operating Systems")
            {
                new ValueTreeNode <string>("Linux")
                {
                    new ValueTreeNode <string>("Ubuntu"),
                    new ValueTreeNode <string>("Fedora"),
                    new ValueTreeNode <string>("CentOS")
                },
                new ValueTreeNode <string>("Windows")
                {
                    new ValueTreeNode <string>("Windows 7"),
                    new ValueTreeNode <string>("Windows XP")
                    {
                        new ValueTreeNode <string>("Home Edition"),
                        new ValueTreeNode <string>("Professional Edition")
                    }
                }
            };

            // Act

            var xp   = tree[1][1];
            var root = xp.Parent.Parent;

            // Assert
            Assert.AreEqual("Windows XP", xp.Value);
            Assert.AreEqual(tree, root);
        }
コード例 #2
0
        /// <summary>
        /// Removes the first occurrence of a specific object from the BinarySearchTree&lt;T&gt;.
        /// </summary>
        /// <param name="item">The object to be removed.</param>
        /// <returns>true if item was successfully removed from the BinarySearchTree&lt;T&gt;; otherwise, false.</returns>
        public virtual bool Remove(T item)
        {
            ValueTreeNode current = this.Find(item);

            if (current == null)
            {
                return(false);
            }
            if (current.Count > 1)
            {
                current.Count--;
                this.Count--;
                return(true);
            }
            if (current.Left == null || current.Right == null)
            {
                this.Delete(current);
            }
            else
            {
                ValueTreeNode replace = (ValueTreeNode)this.Predecessor(current);
                if (replace == null)
                {
                    replace = (ValueTreeNode)this.Successor(current);
                }
                current.Value = replace.Value;
                current.Count = replace.Count;
                this.Delete(replace);
            }
            this.Count--;
            return(true);
        }
コード例 #3
0
ファイル: TreeTests.cs プロジェクト: JamesMenetrey/Tree.NET
        public void DynamicImplementation()
        {
            // Arrange
            var tree = new ValueTreeNode <string>("Operating Systems");

            // Act
            tree.Add(
                new ValueTreeNode <string>("Linux",
                                           new ValueTreeNode <string>("Ubuntu"),
                                           new ValueTreeNode <string>("Fedora"),
                                           new ValueTreeNode <string>("CentOS")
                                           ));
            tree.Add(
                new ValueTreeNode <string>("Windows",
                                           new ValueTreeNode <string>("Windows 7"),
                                           new ValueTreeNode <string>("Windows XP",
                                                                      new ValueTreeNode <string>("Home Edition"),
                                                                      new ValueTreeNode <string>("Professional Edition")
                                                                      )));

            var xp   = tree[1][1];
            var root = xp.Parent.Parent;

            Tools.PrintAllNodes(tree, 0);

            // Assert
            Assert.AreEqual("Windows XP", xp.Value);
            Assert.AreEqual(tree, root);
        }
コード例 #4
0
                /// <summary>
                /// Adds the specified value to the SplayTree&lt;T&gt;.
                /// </summary>
                /// <param name="item">The value to add.</param>
                public override void Add(T item)
                {
                    ValueTreeNode node = new ValueTreeNode(item);

                    node = base.Add(node);
                    this.Splay(node);
                }
コード例 #5
0
                private void Rebalance(ValueTreeNode node)
                {
                    int  size = 1, leftSize, rightSize;
                    bool leftC;

                    while (node.Parent != null)
                    {
                        leftC = node.Parent.Left == node;
                        node  = node.Parent;
                        if (leftC)
                        {
                            rightSize = this.Size(node.Right);
                            leftSize  = size;
                        }
                        else
                        {
                            leftSize  = this.Size(node.Left);
                            rightSize = size;
                        }
                        size = leftSize + rightSize + 1;

                        if (leftSize > alpha * size || rightSize > alpha * size)
                        {
                            this.Flatten(node, size);
                            return;
                        }
                    }
                }
コード例 #6
0
            public bool MoveNext()
            {
                ValueTreeNode successor;

                if (tree.root == null)
                {
                    return(false);
                }
                if (currentNode == null)
                {
                    currentNode = (ValueTreeNode)tree.root;
                    while (currentNode.Left != null)
                    {
                        currentNode = (ValueTreeNode)currentNode.Left;
                    }
                    return(true);
                }
                if (currentNode.Count > currentCount)
                {
                    currentCount++;
                    return(true);
                }
                if ((successor = (ValueTreeNode)tree.Successor(currentNode)) != null)
                {
                    currentNode  = successor;
                    currentCount = 1;
                    return(true);
                }
                return(false);
            }
コード例 #7
0
                protected override ValueTreeNode Find(T item)
                {
                    ValueTreeNode current = (ValueTreeNode)this.root, previous = null;

                    while (current != null)
                    {
                        int c = item.CompareTo(current.Value);
                        previous = current;
                        if (c < 0)
                        {
                            current = current.Left;
                        }
                        else if (c > 0)
                        {
                            current = current.Right;
                        }
                        else
                        {
                            break;
                        }
                    }

                    this.Splay(previous);
                    return(current);
                }
コード例 #8
0
 private int Size(ValueTreeNode node)
 {
     if (node == null)
     {
         return(0);
     }
     return(this.Size(node.Left) + this.Size(node.Right) + 1);
 }
コード例 #9
0
                protected override ValueTreeNode Add(ValueTreeNode node)
                {
                    int depth = 0;

                    this.Count++;
                    if (this.root == null)
                    {
                        this.root = node;
                        this.size++;
                        return(node);
                    }
                    ValueTreeNode current = (ValueTreeNode)this.root;

                    while (current != null)
                    {
                        depth++;
                        int c = node.Value.CompareTo(current.Value);
                        if (c < 0)
                        {
                            if (current.Left != null)
                            {
                                current = current.Left;
                            }
                            else
                            {
                                current.Left = node;
                                break;
                            }
                        }
                        else if (c > 0)
                        {
                            if (current.Right != null)
                            {
                                current = current.Right;
                            }
                            else
                            {
                                current.Right = node;
                                break;
                            }
                        }
                        else
                        {
                            current.Count++;
                            return(current);
                        }
                    }
                    this.size++;
                    this.maxSize = Math.Max(size, maxSize);
                    node.Parent  = current;

                    if (depth > Math.Log(this.size, 1 / alpha))
                    {
                        this.Rebalance(node);
                    }

                    return(node);
                }
コード例 #10
0
 private void Flatten(ValueTreeNode node, ValueTreeNode[] array, ref int index)
 {
     if (node == null)
     {
         return;
     }
     this.Flatten(node.Left, array, ref index);
     array[index++] = node;
     this.Flatten(node.Right, array, ref index);
 }
コード例 #11
0
                /// <summary>
                /// Removes the first occurrence of a specific object from the SplayTree&lt;T&gt;.
                /// </summary>
                /// <param name="item">The object to be removed.</param>
                /// <returns>true if item was successfully removed from the SplayTree&lt;T&gt;; otherwise, false.</returns>
                public override bool Remove(T item)
                {
                    ValueTreeNode current = (ValueTreeNode)this.root, previous = null;

                    while (current != null)
                    {
                        previous = current;
                        if (item.CompareTo(current.Value) < 0)
                        {
                            current = current.Left;
                        }
                        else if (item.CompareTo(current.Value) > 0)
                        {
                            current = current.Right;
                        }
                        else
                        {
                            break;
                        }
                    }

                    if (current == null)
                    {
                        this.Splay(previous);
                        return(false);
                    }

                    if (current.Count > 1)
                    {
                        this.Splay(current);
                        current.Count--;
                        return(true);
                    }

                    if (current.Left == null || current.Right == null)
                    {
                        this.Delete(current);
                    }
                    else
                    {
                        ValueTreeNode replace = (ValueTreeNode)this.Predecessor(current);
                        if (replace == null)
                        {
                            replace = (ValueTreeNode)this.Successor(current);
                        }

                        current.Value = replace.Value;
                        current.Count = replace.Count;

                        this.Delete(replace);
                    }

                    this.Count--;
                    return(true);
                }
コード例 #12
0
 private void AddAt(ValueTreeNode node, ValueTreeNode root, bool left)
 {
     if (left)
     {
         root.Left = node;
     }
     else
     {
         root.Right = node;
     }
     node.Parent = root;
 }
コード例 #13
0
        private void Flatten(ValueTreeNode node, int size)
        {
            if (node == null)
            {
                return;
            }
            ValueTreeNode[] nodes = new ValueTreeNode[size];
            int             index = 0;

            this.Flatten(node, nodes, ref index);
            this.InsertMedians(nodes, node.Parent);
        }
コード例 #14
0
ファイル: TreeTests.cs プロジェクト: JamesMenetrey/Tree.NET
        internal static void PrintAllNodes <T>(ValueTreeNode <T> node, uint level)
        {
            for (var i = 0; i < level; i++)
            {
                Console.Write("-");
            }
            Console.WriteLine(node.Value);

            foreach (var child in node)
            {
                PrintAllNodes(child, level + 1);
            }
        }
コード例 #15
0
                private void InsertMedians(ValueTreeNode[] array, ValueTreeNode root, int start, int end, bool left)
                {
                    if (end == start)
                    {
                        return;
                    }
                    int           median = (end - start) / 2 + start;
                    ValueTreeNode node   = new ValueTreeNode(array[median].Value);

                    node.Count = array[median].Count;
                    this.AddAt(node, root, left);
                    this.InsertMedians(array, node, start, median, true);
                    this.InsertMedians(array, node, median + 1, end, false);
                }
コード例 #16
0
                private void Splay(ValueTreeNode start)
                {
                    bool leftC, leftPC;

                    if (this.root == start || start == null)
                    {
                        return;
                    }

                    leftC = start == start.Parent.Left;

                    if (start.Parent.Parent == null)
                    {
                        if (leftC)
                        {
                            this.RotateRight(start.Parent);
                        }
                        else
                        {
                            this.RotateLeft(start.Parent);
                        }
                        return;
                    }

                    leftPC = start.Parent == start.Parent.Parent.Left;

                    if (leftC && leftPC)
                    {
                        this.RotateRight(start.Parent.Parent);
                        this.RotateRight(start.Parent);
                    }
                    else if (!leftC && !leftPC)
                    {
                        this.RotateLeft(start.Parent.Parent);
                        this.RotateLeft(start.Parent);
                    }
                    else if (!leftC && leftPC)
                    {
                        this.RotateLeft(start.Parent);
                        this.RotateRight(start.Parent);
                    }
                    else
                    {
                        this.RotateRight(start.Parent);
                        this.RotateLeft(start.Parent);
                    }

                    this.Splay(start);
                }
コード例 #17
0
        protected virtual ValueTreeNode Add(ValueTreeNode node)
        {
            this.Count++;
            if (this.root == null)
            {
                this.root = node;
                return(node);
            }
            ValueTreeNode current = (ValueTreeNode)this.root;

            while (current != null)
            {
                int c = node.Value.CompareTo(current.Value);
                if (c < 0)
                {
                    if (current.Left != null)
                    {
                        current = current.Left;
                    }
                    else
                    {
                        current.Left = node;
                        break;
                    }
                }
                else if (c > 0)
                {
                    if (current.Right != null)
                    {
                        current = current.Right;
                    }
                    else
                    {
                        current.Right = node;
                        break;
                    }
                }
                else
                {
                    current.Count++;
                    return(current);
                }
            }
            node.Parent = current;
            return(node);
        }
コード例 #18
0
                /// <summary>
                /// Removes the specified value from the ScapeGoatTree&lt;T&gt;.
                /// </summary>
                /// <param name="item">The value to remove.</param>
                /// <returns>true if item was successfully removed from the ScapeGoatTree&lt;T&gt;; otherwise, false.</returns>
                public override bool Remove(T item)
                {
                    ValueTreeNode current = this.Find(item);

                    if (current == null)
                    {
                        return(false);
                    }

                    if (current.Count > 1)
                    {
                        current.Count--;
                        this.Count--;
                        return(true);
                    }

                    if (current.Left == null || current.Right == null)
                    {
                        this.Delete(current);
                    }
                    else
                    {
                        ValueTreeNode replace = (ValueTreeNode)this.Predecessor(current);
                        if (replace == null)
                        {
                            replace = (ValueTreeNode)this.Successor(current);
                        }

                        current.Value = replace.Value;
                        current.Count = replace.Count;

                        this.Delete(replace);
                    }

                    this.Count--;
                    this.size--;

                    if (this.size <= this.maxSize / 2)
                    {
                        this.Flatten((ValueTreeNode)this.root, this.size);
                        this.maxSize = this.size;
                    }

                    return(true);
                }
コード例 #19
0
        /// <summary>
        /// Override lookup filter data tree.
        ///
        /// Requirement summary:
        /// If logged user has role VP --> show all region
        /// If logged user has role Manager --> show some regions ("South America", "North America")
        /// If logged user has role Employy --> show only one region ("South America")
        /// </summary>
        /// <param name="fieldInfo"></param>
        /// <returns></returns>
        public override List <ValueTreeNode> OnLoadFilterDataTree(QuerySourceFieldInfo fieldInfo)
        {
            var result = new List <ValueTreeNode>();

            if (fieldInfo.QuerySourceName == "OrderDetailsByRegion" && fieldInfo.Name == "CountryRegionName" &&
                (HttpContext.Current.User.IsInRole("Manager") || HttpContext.Current.User.IsInRole("Employee")))
            {
                //Node [All] and [Blank] are required for UI to render.
                var rootNode = new ValueTreeNode {
                    Text = "[All]", Value = "[All]"
                };
                rootNode.Nodes = new List <ValueTreeNode>();
                //rootNode.Nodes.Add(new ValueTreeNode { Text = "[Blank]", Value = "[Blank]" });


                if (HttpContext.Current.User.IsInRole("Manager"))
                {
                    rootNode.Nodes.Add(new ValueTreeNode {
                        Text = "South America", Value = "South America"
                    });
                    rootNode.Nodes.Add(new ValueTreeNode {
                        Text = "North America", Value = "North America"
                    });
                }

                if (HttpContext.Current.User.IsInRole("Employee"))
                {
                    rootNode.Nodes.Add(new ValueTreeNode {
                        Text = "South America", Value = "South America"
                    });
                }

                //else
                //{
                //    rootNode.Nodes.Add(new ValueTreeNode { Text = "Europe", Value = "Europe" });
                //    rootNode.Nodes.Add(new ValueTreeNode { Text = "South America", Value = "South America" });
                //    rootNode.Nodes.Add(new ValueTreeNode { Text = "North America", Value = "North America" });
                //}

                result.Add(rootNode);
            }

            return(result);
        }
コード例 #20
0
                private void InsertMedians(ValueTreeNode[] array, ValueTreeNode root)
                {
                    int           median     = array.Length / 2;
                    ValueTreeNode medianNode = new ValueTreeNode(array[median].Value);

                    medianNode.Count  = array[median].Count;
                    medianNode.Parent = root;
                    if (root == null)
                    {
                        this.root = medianNode;
                    }
                    else if (medianNode.Value.CompareTo(root.Value) < 0)
                    {
                        root.Left = medianNode;
                    }
                    else
                    {
                        root.Right = medianNode;
                    }
                    this.InsertMedians(array, medianNode, 0, median, true);
                    this.InsertMedians(array, medianNode, median + 1, array.Length, false);
                }
コード例 #21
0
        protected virtual ValueTreeNode Find(T item)
        {
            ValueTreeNode current = (ValueTreeNode)this.root;

            while (current != null)
            {
                int c = item.CompareTo(current.Value);
                if (c < 0)
                {
                    current = current.Left;
                }
                else if (c > 0)
                {
                    current = current.Right;
                }
                else
                {
                    break;
                }
            }
            return(current);
        }
コード例 #22
0
 public void Reset()
 {
     this.currentNode = null; this.currentCount = 1;
 }
コード例 #23
0
 public BSTEnumerator(BinarySearchTree <T> tree)
 {
     this.tree         = tree;
     this.currentNode  = null;
     this.currentCount = 1;
 }