blob: 33303f6a6ce867910ffeeef2b1949bf8cdb6beab [file] [log] [blame]
/*
* Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package gc.gctests.gctest03;
class DataNodeException extends Exception
{
}
class DataNode {
int key;
int buf[];
static int dataNodeCount = 0;
static int dataNodeLimit;
static synchronized void incDataNodeCount()
{
dataNodeCount++;
}
static synchronized int getDataNodeCount()
{
return dataNodeCount;
}
static synchronized void setDataNodeLimit(int newLimit)
{
dataNodeLimit = newLimit;
}
static synchronized int getDataNodeLimit()
{
return dataNodeLimit;
}
static synchronized void clearDataNodeCount()
{
dataNodeCount = 0;
}
DataNode(int key) throws DataNodeException
{
incDataNodeCount();
if (getDataNodeCount() > getDataNodeLimit())
{
throw (new DataNodeException());
}
this.key = key;
try {
buf = new int[key];
}
catch ( OutOfMemoryError e )
{
System.out.println(Thread.currentThread().getName() + " : outofmemory");
}
}
public void print()
{
System.out.println(key);
}
public boolean equals(DataNode d)
{
int k = d.getkey();
return ( key == k);
}
public boolean large(DataNode d)
{
int k = d.getkey();
return ( key > k);
}
public boolean less(DataNode d)
{
int k = d.getkey();
return ( key < k);
}
public int getkey()
{ return key; }
}
class TreeNode {
DataNode data;
TreeNode parent;
TreeNode left;
TreeNode right;
TreeNode(DataNode key)
{
this.data = key;
parent = null;
left = null;
right = null;
}
public void print()
{
data.print();
}
public TreeNode getleft()
{
return left;
}
public TreeNode getright()
{
return right;
}
public TreeNode getparent()
{
return parent;
}
public synchronized void setleft(TreeNode left)
{
this.left = left;
}
public synchronized void setright(TreeNode right)
{
this.right = right;
}
public synchronized void setparent(TreeNode parent)
{
this.parent = parent;
}
public DataNode getData()
{
return data;
}
// print it out in order of a large one first
public void sprint()
{
//print itself
if ( left != null ) left.sprint();
System.out.println(data.getkey());
if ( right != null ) right.sprint();
}
// print it out in order of a small one first
public void lprint()
{
if (right != null ) right.lprint();
System.out.println(data.getkey());
if ( left != null ) left.lprint();
}
public synchronized TreeNode duplicate()
{
TreeNode tp = new TreeNode(data);
if ( left != null )
{
tp.left = left.duplicate();
}
if ( right != null )
{
tp.right = right.duplicate();
}
return tp;
}
public TreeNode search(DataNode d)
{
TreeNode tp = this;
DataNode k;
while ( tp != null )
{
k = tp.getData();
if ( k.equals(d) )
{
return tp;
}
else
if ( d.large(k) )
tp = tp.getright();
else
tp = tp.getleft();
}
return null;
}
public synchronized void insert(TreeNode t)
{
DataNode d = t.getData();
TreeNode tp = this;
TreeNode tp1 = tp;
DataNode d0;
while ( true )
{
d0 = tp.getData();
if ( d.large(d0) )
{
tp1 = tp;
tp = tp.getright();
if ( tp == null )
{
tp1.setright(t);
t.setparent(tp1);
break;
}
}
else
{
tp1 = tp;
tp = tp.getleft();
if (tp == null )
{
tp1.setleft(t);
t.setparent(tp1);
break;
}
}
}
}
}
class Tree {
TreeNode root = null;
Tree()
{
root = null;
}
Tree(TreeNode root)
{
this.root = root;
}
public synchronized void insert(TreeNode t)
{
if ( root == null )
{
root = t;
return;
}
root.insert(t);
}
public void sort1()
{
root.sprint();
}
public void sort2()
{
root.lprint();
}
public TreeNode search(DataNode d)
{
if ( root == null ) return null;
else return root.search(d);
}
public synchronized boolean remove(DataNode d)
{
if ( root == null ) return false;
TreeNode t = root.search(d);
// data is not in a heap
if ( t == null ) return false;
/*
if ( d.equals(t.getData()) == false )
{
System.out.println("failed");
return false;
}
*/
TreeNode p = t.getparent();
TreeNode l = t.getleft();
TreeNode r = t.getright();
// the removed node is a root
if ( p == null )
{
if ( l == null && r != null )
{
r.setparent(null);
root = r;
return true;
}
if ( l != null && r == null )
{
l.setparent(null);
root = l;
return true;
}
if ( l == null && r == null )
{
root = null;
return true;
}
if ( l != null && r != null )
{
r.setparent(null);
r.insert(l);
root = r;
return true;
}
}
// a leaf
if ( r == null && l == null )
{
if ( p.getright() == t )
{
/* right child */
p.setright(null);
}
else
p.setleft(null);
return true;
}
// a node without left child
if ( r != null && l == null )
{
r.setparent(p);
if ( t == p.getright() ) p.setright(r);
if ( t == p.getleft() ) p.setleft(r);
return true;
}
if ( r == null && l != null )
{
l.setparent(p);
if ( t == p.getright() ) p.setright(l);
if ( t == p.getleft() ) p.setleft(l);
return true;
}
// a node with two children
r.insert(l);
r.setparent(p);
if ( t == p.getright() ) p.setright(r);
if ( t == p.getleft() ) p.setleft(r);
return true;
}
public synchronized Tree copy()
{
if ( root == null ) return null;
return(new Tree(root.duplicate()));
}
public synchronized boolean isempty()
{
return ( root == null );
}
}