package org.lyk.entities;
import java.util.HashMap;
import java.util.Map;
import org.lyk.interfaces.IBiTree;public class BiTree> implements IBiTree{private class Node>{privateN data;private Nodeleft;private Noderight;privateNode(N data)
{if (null ==data)return;this.data =data;
}public voidaddWithOrder(N data)
{//if(this.data.compareTo(data) < 0)
if (data.compareTo(this.data) < 0)
{if (null == this.left)
{this.left = new Node(data);
BiTree.this.count++;
}else
this.left.addWithOrder(data);
}else{if (null == this.right)
{this.right = new Node(data);
BiTree.this.count++;
}else
this.right.addWithOrder(data);
}
}public voidtoArrayFirst(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 voidtoArrayMiddle(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 voidtoArrayLast(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 root = null;private int foot = 0;
@Overridepublic voidaddWithOrder(T data)
{if (null ==data)return;if (null == this.root)
{this.root = new Node(data);this.count++;
}else{this.root.addWithOrder(data);
}
}
@Overridepublic voidaddFirst(T[] data, T endFlag)
{if (null ==data)
{return;
}this.foot = 0;this.root = this.addFirstInternal(data, endFlag, this.root);
}private Node addFirstInternal(T[] data, T endFlag, Nodenode)
{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);returnnode;
}
}
@OverridepublicObject[] toArrayFirst()
{if (this.isEmpty())return null;
Object[] retVal= new Object[this.count];this.foot = 0;this.root.toArrayFirst(retVal);returnretVal;
}
@OverridepublicObject[] toArrayMiddle()
{if (this.isEmpty())return null;
Object[] retVal= new Object[this.count];this.foot = 0;this.root.toArrayMiddle(retVal);returnretVal;
}
@OverridepublicObject[] toArrayLast()
{if (this.isEmpty())return null;
Object[] retVal= new Object[this.count];this.foot = 0;this.root.toArrayLast(retVal);returnretVal;
}
@Overridepublic intsize()
{return this.count;
}
@Overridepublicboolean isEmpty()
{if (0 == this.count && null == this.root)return true;else
return false;
}
@Overridepublic voiddelete(T data)
{if (this.isEmpty())return;
Map nodeDel = this.find(data);if (null ==nodeDel)return;
Node node = (Node) nodeDel.get("node");
Node parent = (Node) 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 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 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 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 getSubsessor(NodenodeDel)
{
Node parent =nodeDel;
Node subsessor =nodeDel.right;
subsessor= this.getSubsessorInternal(parent, subsessor, nodeDel);returnsubsessor;
}private Node getSubsessorInternal(Node parent, Node subsessor, NodenodeDel)
{if (null !=subsessor.left)
{
parent=subsessor;
subsessor=subsessor.left;returngetSubsessorInternal(parent, subsessor, nodeDel);
}else{if (subsessor !=nodeDel.right)
{
parent.left=subsessor.right;
subsessor.right=nodeDel.right;
}returnsubsessor;
}
}private Mapfind(T data)
{return this.findInternal(this.root, null, null, data);
}private Map findInternal(Node node, Nodeparent, String direction, T data)
{
Map retVal = null;if(node.data.equals(data))
{
retVal= new HashMap<>();
retVal.put("node", node);
retVal.put("parent", parent);
retVal.put("direction", direction);returnretVal;
}else{if (null !=node.left)
{//parent = node;//node = node.left;
retVal = this.findInternal(node.left, node, "left", data);if(null !=retVal)returnretVal;
}if (null !=node.right)
{//parent = node;//node = node.right;
retVal = this.findInternal(node.right, node, "right", data);if(null !=retVal)returnretVal;
}
}returnretVal;
}
@Overridepublicboolean contains(T data)
{//TODO Auto-generated method stub
return false;
}
}