diff --git a/AttributesAPI/src/org/gephi/data/attributes/type/IntervalTree.java b/AttributesAPI/src/org/gephi/data/attributes/type/IntervalTree.java index 44dde3979..65e06e0af 100644 --- a/AttributesAPI/src/org/gephi/data/attributes/type/IntervalTree.java +++ b/AttributesAPI/src/org/gephi/data/attributes/type/IntervalTree.java @@ -132,8 +132,12 @@ private void insert(Node z) { x = x.left; else x = x.right; y.max = Math.max(z.max, y.max); + if (y.p == root) + root.max = y.max; } z.p = y; + if (y == root) + root.max = z.max; if (y == root || compareLow(z.i, y.i)) y.left = z; else y.right = z; @@ -202,8 +206,11 @@ public void delete(Interval interval) { private void delete(Node z) { z.max = Double.NEGATIVE_INFINITY; - for (Node i = z.p; i != root; i = i.p) + for (Node i = z.p; i != root; i = i.p) { i.max = Math.max(i.left.max, i.right.max); + if (i.p == root) + root.max = i.max; + } Node y; Node x; @@ -307,6 +314,8 @@ private void leftRotate(Node x) { y.left = x; x.p = y; + if (y.p == root) + root.max = x.max; y.max = x.max; x.max = Math.max(x.i.getHigh(), Math.max(x.left.max, x.right.max)); } @@ -324,6 +333,8 @@ private void rightRotate(Node x) { y.right = x; x.p = y; + if (y.p == root) + root.max = x.max; y.max = x.max; x.max = Math.max(x.i.getHigh(), Math.max(x.left.max, x.right.max)); } diff --git a/AttributesAPI/test/unit/src/org/gephi/data/attributes/type/IntervalTreeTest.java b/AttributesAPI/test/unit/src/org/gephi/data/attributes/type/IntervalTreeTest.java new file mode 100644 index 000000000..2cae897c4 --- /dev/null +++ b/AttributesAPI/test/unit/src/org/gephi/data/attributes/type/IntervalTreeTest.java @@ -0,0 +1,96 @@ +/* +Copyright 2008-2010 Gephi +Authors : Cezary Bartosiak +Website : http://www.gephi.org + +This file is part of Gephi. + +DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + +Copyright 2011 Gephi Consortium. All rights reserved. + +The contents of this file are subject to the terms of either the GNU +General Public License Version 3 only ("GPL") or the Common +Development and Distribution License("CDDL") (collectively, the +"License"). You may not use this file except in compliance with the +License. You can obtain a copy of the License at +http://gephi.org/about/legal/license-notice/ +or /cddl-1.0.txt and /gpl-3.0.txt. See the License for the +specific language governing permissions and limitations under the +License. When distributing the software, include this License Header +Notice in each file and include the License files at +/cddl-1.0.txt and /gpl-3.0.txt. If applicable, add the following below the +License Header, with the fields enclosed by brackets [] replaced by +your own identifying information: +"Portions Copyrighted [year] [name of copyright owner]" + +If you wish your version of this file to be governed by only the CDDL +or only the GPL Version 3, indicate your decision by adding +"[Contributor] elects to include this software in this distribution +under the [CDDL or GPL Version 3] license." If you do not indicate a +single choice of license, a recipient has the option to distribute +your version of this file under either the CDDL, the GPL Version 3 or +to extend the choice of license to its licensees as provided above. +However, if you add GPL Version 3 code and therefore, elected the GPL +Version 3 license, then the option applies only if the new code is +made subject to such option by the copyright holder. + +Contributor(s): + +Portions Copyrighted 2011 Gephi Consortium. +*/ +package org.gephi.data.attributes.type; + +import java.util.ArrayList; +import java.util.List; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.junit.Assert.*; + +/** + * Unit test for IntervalTree class. + * + * @author Cezary Bartosiak + */ +public class IntervalTreeTest { + public IntervalTreeTest() { } + + @BeforeClass + public static void setUpClass() throws Exception { } + + @AfterClass + public static void tearDownClass() throws Exception { } + + @Before + public void setUp() { } + + @After + public void tearDown() { } + + @Test + public void testClass() { + System.out.println("Class"); + + IntervalTree itree = new IntervalTree(); + itree.insert(new Interval(1.0, 1.0)); + itree.insert(new Interval(5.0, 5.0)); + itree.insert(new Interval(7.0, 7.0)); + itree.delete(new Interval(5.0, 5.0)); + itree.insert(new Interval(5.0, 6.0)); + itree.delete(new Interval(5.0, 7.0)); + itree.insert(new Interval(5.0, 7.0)); + itree.delete(new Interval(1.0, 1.0)); + itree.insert(new Interval(1.0, 2.0)); + itree.delete(new Interval(1.0, 2.0)); + itree.insert(new Interval(1.0, 2.0)); + List> list = new ArrayList>(); + list.add(new Interval(5.0, 7.0)); + assertEquals(itree.search(4.0, 5.0), list); + System.out.println("itree.search(4.0, 5.0): " + itree.search(4.0, 5.0)); + System.out.println("list: " + list); + System.out.println(); + } +}