package data_structure;
public class MyBinaryTree {
private BinaryTreeNode root;
private int size;
public void add(int key,Object o) {
size++;
BinaryTreeNode target=null;
final BinaryTreeNode parent=root;
final BinaryTreeNode newnode=new BinaryTreeNode(key,o,null,null,null);
if(parent==null)
root=newnode;
else{
target=compareKey(key,parent);
if (key < target.key) {
target.left = newnode;
newnode.top = target;
} else if(key > target.key){
target.right = newnode;
newnode.top = target;
}
else{
target.data=o;
size--;
}
}
}
public Object get(int key){
BinaryTreeNode target=null;
target=search( key);
if(target==null)
return null;
else
return target.data;
}
private BinaryTreeNode search(int key){
BinaryTreeNode target=null;
final BinaryTreeNode parent=root;
if(parent==null)
return null;
else
target=compareKey(key,parent);
if (key == target.key) {
return target;
}
return null;
}
public Object remove(int key){
BinaryTreeNode replace=null;
BinaryTreeNode target=null;
BinaryTreeNode oldnode=null;
target=search( key);
if(target==null)
return null;
else
{
oldnode=target;
if(target.left==null&&target.right==null){
changeParent( target,null);
target=null;
}
else if(target.left!=null&&target.right==null){
// replace=next(target.left);
// target=replace;
// changeParent(target,replace);
// changeChild(target, replace);
// changeParent(replace,null);
// target=null;
replace=target.left;
changeParent(target,replace);
replace.top=target.top;
target=null;
}
else if(target.left==null&&target.right!=null){
// replace=prev(target.right);
// target=replace;
// changeParent(target,replace);
// changeChild(target, replace);
// changeParent(replace,null);
// replace=null;
replace=target.right;
changeParent(target,replace);
replace.top=target.top;
target=null;
}
else if(target.left!=null&&target.right!=null){
int prev=prev(target.right).key;
int next=next(target.left).key;
if((next-key)>(key-prev))
replace=prev(target.right);
else
replace=next(target.left);
target=replace;
changeParent(target,replace);
changeChild(target, replace);
changeParent(replace,null);
replace=null;
}
}
size--;
return oldnode.data;
}
private void changeParent(BinaryTreeNode target,BinaryTreeNode child){
BinaryTreeNode targetparent=null;
targetparent=target.top;
if(targetparent.key>target.key)
targetparent.left=child;
else
targetparent.right=child;
}
private void changeChild(BinaryTreeNode target,BinaryTreeNode parent){
BinaryTreeNode targetleftchild=null;
BinaryTreeNode targetrightchild=null;
targetleftchild=target.left;
targetrightchild=target.right;
if(targetleftchild!=null)
targetleftchild.top=parent;
if(targetrightchild!=null)
targetrightchild.top=parent;
}
//找到前驱节点
private BinaryTreeNode prev(BinaryTreeNode target){
// BinaryTreeNode prev=null;
while(target.left!=null){
target=target.left;
}
return target;
}
//找到后驱节点
private BinaryTreeNode next(BinaryTreeNode target){
// BinaryTreeNode next=null;
while(target.right!=null){
target=target.right;
}
return target;
}
public int size(){
return size;
}
private BinaryTreeNode compareKey(int key ,BinaryTreeNode node) {
BinaryTreeNode parent=node;
while (parent != null) {
if (key < parent.key&&parent.left!=null) {
parent = parent.left;
} else if (key > parent.key&&parent.right!=null) {
parent = parent.right;
} else {
return parent;
}
}
return parent;
}
private static class BinaryTreeNode{
Object data;
int key;
BinaryTreeNode left;
BinaryTreeNode right;
BinaryTreeNode top;
public BinaryTreeNode(int key,Object o, BinaryTreeNode top, BinaryTreeNode left,BinaryTreeNode right){
this.key=key;
this.data=o;
this.left=left;
this.right=right;
this.top=top;
}
}
}