package org.lyk.interfaces;
import java.util.List;
public interface IBiTree<T extends Comparable<T>>
{
public void addWithOrder(T data);
public void addFirst(T[] data,T endFlag);
public Object[] toArrayFirst();
public Object[] toArrayMiddle();
public Object[] toArrayLast();
public int size();
public boolean isEmpty();
public boolean contains(T data);
public void delete(T data);
}
package org.lyk.entities;
import java.util.HashMap;
import java.util.Map;
import org.lyk.interfaces.IBiTree;
public class BiTree<T extends Comparable<T>> implements IBiTree<T>
{
private class Node<N extends Comparable<N>>
{
private N data;
private Node<N> left;
private Node<N> right;
private Node(N data)
{
if (null == data)
return;
this.data = data;
}
public void addWithOrder(N data)
{
// if(this.data.compareTo(data) < 0)
if (data.compareTo(this.data) < 0)
{
if (null == this.left)
{
this.left = new Node<N>(data);
BiTree.this.count++;
} else
this.left.addWithOrder(data);
} else
{
if (null == this.right)
{
this.right = new Node<N>(data);
BiTree.this.count++;
} else
this.right.addWithOrder(data);
}
}
public void toArrayFirst(Object[] retVal)
{
retVal[BiTree.this.foot++] = this.data;
if (null != this.left)
this.left.toArrayFirst(retVal);
if (null != this.right)
this.right.toArrayFirst(retVal);
}
public void toArrayMiddle(Object[] retVal)
{
if (null != this.left)
this.left.toArrayMiddle(retVal);
retVal[BiTree.this.foot++] = this.data;
if (null != this.right)
this.right.toArrayMiddle(retVal);
}
public void toArrayLast(Object[] retVal)
{
if (null != this.left)
this.left.toArrayLast(retVal);
if (null != this.right)
this.right.toArrayLast(retVal);
retVal[BiTree.this.foot++] = this.data;
}
}
private int count = 0;
private Node<T> root = null;
private int foot = 0;
@Override
public void addWithOrder(T data)
{
if (null == data)
return;
if (null == this.root)
{
this.root = new Node<T>(data);
this.count++;
} else
{
this.root.addWithOrder(data);
}
}
@Override
public void addFirst(T[] data, T endFlag)
{
if (null == data)
{
return;
}
this.foot = 0;
this.root = this.addFirstInternal(data, endFlag, this.root);
}
private Node<T> addFirstInternal(T[] data, T endFlag, Node<T> node)
{
if (data[this.foot].equals(endFlag))
{
this.foot++;
return null;
} else
{
node.data = data[this.foot];
this.foot++;
node.left = this.addFirstInternal(data, endFlag, node.left);
node.right = this.addFirstInternal(data, endFlag, node.right);
return node;
}
}
@Override
public Object[] toArrayFirst()
{
if (this.isEmpty())
return null;
Object[] retVal = new Object[this.count];
this.foot = 0;
this.root.toArrayFirst(retVal);
return retVal;
}
@Override
public Object[] toArrayMiddle()
{
if (this.isEmpty())
return null;
Object[] retVal = new Object[this.count];
this.foot = 0;
this.root.toArrayMiddle(retVal);
return retVal;
}
@Override
public Object[] toArrayLast()
{
if (this.isEmpty())
return null;
Object[] retVal = new Object[this.count];
this.foot = 0;
this.root.toArrayLast(retVal);
return retVal;
}
@Override
public int size()
{
return this.count;
}
@Override
public boolean isEmpty()
{
if (0 == this.count && null == this.root)
return true;
else
return false;
}
@Override
public void delete(T data)
{
if (this.isEmpty())
return;
Map<String, Object> nodeDel = this.find(data);
if (null == nodeDel)
return;
Node<T> node = (Node<T>) nodeDel.get("node");
Node<T> parent = (Node<T>) nodeDel.get("parent");
String direction = (String) nodeDel.get("direction");
if (null == node.left && null == node.right)
{
if (null == direction)
{
this.root = null;
} else
{
if ("left".equals(direction))
{
parent.left = null;
} else if ("right".equals(direction))
{
parent.right = null;
}
}
this.count--;
return;
}
if (null != node.left && null == node.right)
{
// 该节点只有左子树
if (null == direction)
{
Node<T> temp = this.root;
this.root = this.root.left;
temp.left = null;
} else
{
if ("left".equals(direction))
{
parent.left = node.left;
node.left = null;
} else if ("right".equals(direction))
{
parent.right = node.left;
node.left = null;
}
}
this.count--;
return;
}
if (null == node.left && null != node.right)
{
// 该节点只有右子树
if (null == direction)
{
Node<T> temp = this.root;
this.root = this.root.right;
temp.right = null;
} else
{
if ("left".equals(direction))
{
parent.left = node.right;
node.right = null;
} else if ("right".equals(direction))
{
parent.right = node.right;
node.right = null;
}
}
this.count--;
return;
}
Node<T> subsessor = this.getSubsessor(node);
if (null != subsessor)
{
//System.out.println("subsessor:" + subsessor.data);
subsessor.left = node.left;
if (null == direction)
{
this.root = subsessor;
} else if ("left".equals(direction))
{
parent.left = subsessor;
} else if ("right".equals(direction))
{
parent.right = subsessor;
}
this.count--;
}
}
private Node<T> getSubsessor(Node<T> nodeDel)
{
Node<T> parent = nodeDel;
Node<T> subsessor = nodeDel.right;
subsessor = this.getSubsessorInternal(parent, subsessor, nodeDel);
return subsessor;
}
private Node<T> getSubsessorInternal(Node<T> parent, Node<T> subsessor, Node<T> nodeDel)
{
if (null != subsessor.left)
{
parent = subsessor;
subsessor = subsessor.left;
return getSubsessorInternal(parent, subsessor, nodeDel);
} else
{
if (subsessor != nodeDel.right)
{
parent.left = subsessor.right;
subsessor.right = nodeDel.right;
}
return subsessor;
}
}
private Map<String, Object> find(T data)
{
return this.findInternal(this.root, null, null, data);
}
private Map<String, Object> findInternal(Node<T> node, Node<T> parent, String direction, T data)
{
Map<String, Object> retVal = null;
if (node.data.equals(data))
{
retVal = new HashMap<>();
retVal.put("node", node);
retVal.put("parent", parent);
retVal.put("direction", direction);
return retVal;
} else
{
if (null != node.left)
{
// parent = node;
// node = node.left;
retVal = this.findInternal(node.left, node, "left", data);
if(null != retVal)
return retVal;
}
if (null != node.right)
{
// parent = node;
// node = node.right;
retVal = this.findInternal(node.right, node, "right", data);
if(null != retVal)
return retVal;
}
}
return retVal;
}
@Override
public boolean contains(T data)
{
// TODO Auto-generated method stub
return false;
}
}