Beispiel #1
0
        private List <N> IntervalFind(double x1, double y1, double x2, double y2, PriorityBSTNode node)
        {
            List <N> nodes = new List <N>();

            if (node == null)
            {
                return(nodes);
            }

            if (node.Data.X >= x1 && node.Data.X <= x2 && node.Data.Y >= y1 && node.Data.Y <= y2)
            {
                nodes.Add(node.Data);
            }

            if (node.Left != null && y1 <= node.Data.Y && x1 <= node.Border)
            {
                nodes.AddRange(this.IntervalFind(x1, y1, x2, y2, node.Left));
            }

            if (node.Right != null && y1 <= node.Data.Y && x2 > node.Border)
            {
                nodes.AddRange(this.IntervalFind(x1, y1, x2, y2, node.Right));
            }

            return(nodes);
        }
Beispiel #2
0
        private void BuildSubTree(IEnumerable <N> nodes, PriorityBSTNode parent, bool isLeft)
        {
            if (nodes.Count() == 0)
            {
                return;
            }

            var orderedNodes = nodes.OrderBy(node => node.Y).ToList();

            var last = orderedNodes.Last();

            if (isLeft)
            {
                parent.Left = new PriorityBSTNode {
                    Data = last, Parent = parent
                };
            }
            else
            {
                parent.Right = new PriorityBSTNode {
                    Data = last, Parent = parent
                };
            }

            orderedNodes.Remove(last);

            if (orderedNodes.Count == 0)
            {
                if (isLeft)
                {
                    parent.Left.Border = parent.Left.Data.X;
                }
                else
                {
                    parent.Right.Border = parent.Right.Data.X;
                }
            }
            else
            {
                orderedNodes = orderedNodes.OrderBy(node => node.X).ToList();
                int median = (orderedNodes.Count()) / 2;

                if (isLeft)
                {
                    parent.Left.Border = orderedNodes.ElementAt(median).X;

                    this.BuildSubTree(orderedNodes.Where(x => x.X >= 0 && x.X <= parent.Left.Border), parent.Left, true);
                    this.BuildSubTree(orderedNodes.Where(x => x.X > parent.Left.Border), parent.Left, false);
                }
                else
                {
                    parent.Right.Border = orderedNodes.ElementAt(median).X;

                    this.BuildSubTree(orderedNodes.Where(x => x.X >= 0 && x.X <= parent.Right.Border), parent.Right, true);
                    this.BuildSubTree(orderedNodes.Where(x => x.X > parent.Right.Border), parent.Right, false);
                }
            }
        }
Beispiel #3
0
            private void VisitNode(PriorityBSTNode node)
            {
                if (node == null)
                {
                    return;
                }

                this._traverseQueue.Enqueue(node);
                this.VisitNode(node.Left);
                this.VisitNode(node.Right);
            }
Beispiel #4
0
            public bool MoveNext()
            {
                if (this._traverseQueue.Count > 0)
                {
                    this._current = this._traverseQueue.Dequeue();
                }
                else
                {
                    this._current = null;
                }

                return(this._current != null);
            }
Beispiel #5
0
        public void BuildTree(IEnumerable <N> nodes)
        {
            if (nodes == null || nodes.Count() == 0)
            {
                return;
            }

            this.Clear();
            this.Count = nodes.Count();
            this.Nodes = nodes.ToList();

            var orderedNodes = nodes.OrderBy(node => node.Y).ToList();

            var last = orderedNodes.Last();

            this._root = new PriorityBSTNode
            {
                Data = last
            };

            orderedNodes.Remove(last);

            if (orderedNodes.Count == 0)
            {
                _root.Border = _root.Data.X;
            }
            else
            {
                orderedNodes = orderedNodes.OrderBy(node => node.X).ToList();
                int median = (orderedNodes.Count()) / 2;
                _root.Border = orderedNodes.ElementAt(median).X;

                this.BuildSubTree(orderedNodes.Where(x => x.X >= 0 && x.X <= _root.Border), this._root, true);
                this.BuildSubTree(orderedNodes.Where(x => x.X > _root.Border), this._root, false);
            }
        }
Beispiel #6
0
 public void Clear()
 {
     this.Count = 0;
     this._root = null;
     this.Nodes.Clear();
 }
Beispiel #7
0
 public void Reset()
 {
     this._current = null;
 }
Beispiel #8
0
 public void Dispose()
 {
     this._current = null;
     this._tree    = null;
 }