Example #1
0
        // prebudovanie stromu
        // na vstupe je zoznam vsetkych buducich listov podstromu.
        public KDNode rebuilt(List<KDNode> l1, int dim1, KDNode newParent, Boolean isLeft) 
        {
            List<KDNode> l = l1;
            
            // ak je v zozname iba 1 vrchol, vrati sa ako list
            if (l.Count == 1)
            {   
                return l.ElementAt(0);
            }

            int newSplit;
            int dimension;
            if (newParent == null)
            {
                // root ma nastavenu deliacu suradnicu na x.
                dimension = 0;
            } else {
                dimension = 1 - newParent.getDim();
            }
            // vrati split noveho vrchola
            newSplit = findSplit(l, dimension);
            //Console.WriteLine(newSplit);

            List<KDNode> newLeft = new List<KDNode>();
            List<KDNode> newRight = new List<KDNode>();
            Boolean equal = true;
            //rozdelenie na 2 podstromy podla split a dim
            if (dimension == 0) //split cez x-ovu os
            {
                foreach (KDNode n in l) 
                {
                    // zoznam listov v lavom a pravom podstrome podla split
                    if (n.getPoint().X < newSplit)
                    {
                        newLeft.Add(n);
                    }
                    if (n.getPoint().X > newSplit)
                    {
                        newRight.Add(n);
                    }
                    // ak by mali rovnaku suradnicu, aby sa nepridavali len do jedneho podstromu
                    if (n.getPoint().X == newSplit)
                    {
                        if (equal){
                            newLeft.Add(n);
                            equal = false;
                        } else {
                            newRight.Add(n);
                            equal = true;
                        }
                    }
                }

            } else { //split cez y-ovu os
                foreach (KDNode n in l)
                {
                    // zoznam listov v lavom a pravom podstrome podla split
                    if (n.getPoint().Y < newSplit)
                    {
                        newLeft.Add(n);
                    }
                    if (n.getPoint().Y > newSplit)
                    {
                        newRight.Add(n);
                    }
                    // ak by mali rovnaku suradnicu, aby sa nepridavali len do jedneho podstromu
                    if (n.getPoint().Y == newSplit)
                    {
                        if (equal)
                        {
                            newLeft.Add(n);
                            equal = false;
                        } else {
                            newRight.Add(n);
                            equal = true;
                        }
                    }
                }
            }

            // vytvori sa koren noveho podstromu
            KDNode subroot = new KDNode(true, newSplit, dimension, null, this.g);
            if (newParent != null)
            {
                if (isLeft)
                {
                    newParent.setLeft(subroot);
                } else {
                    newParent.setRight(subroot);
                }
            }
            subroot.setParent(newParent);
            subroot.setLeft(rebuilt(newLeft, 1 - dimension, subroot, true));
            subroot.getLeft().setParent(subroot);
            subroot.setRight(rebuilt(newRight, 1 - dimension, subroot, false));
            subroot.getRight().setParent(subroot);

            return subroot;
        }