package tree;
public class Node {
public int iData;//关键字
public int dData;//数据
public Node leftNode;//左孩子
public Node rightNode;//右孩子
public void displayNode(){
System.out.println("{ "+iData+", "+dData+"}");
}
}
package tree;
public class Tree {
private Node root;//根节点
/**本树是根据关键字来插入的,左孩子的关键字比右孩子的关键字小
* 且关键字不会重复*/
public Tree(){
root=null;
}
public Node getRoot() {
return root;
}
public void setRoot(Node root) {
this.root = root;
}
/**根据关键字查找节点,
* @param key 关键字*/
public Node findKey(int key){
Node current=root;
if((current==null)&&(current.rightNode==null)){//判断树是否为空
System.out.println("树为空!");
return null;
}
while(current.iData!=key){
if(current.iData<key){//往左走
current=current.leftNode;
}else{//往右走
current=current.rightNode;
}
if(current==null){
System.out.println("没有该节点! ");
return null;
}
}
return current;
}
/**插入节点
* @param id 关键字
* @param dd 数据项*/
public void insertNode(int id,int dd){
//判断该关键字是否存在
/* Node n=findKey(id);
if(n!=null){
return ;//说明关键字已经存在
}*/
Node node=new Node();
node.iData=id;
node.dData=dd;
if(root==null){
root=node;//如果树为空,则该节点就是该树的根节点
return ;
}
Node parent;
Node current=root;
while(true){//找到插入的位置
parent=current;
if(id<current.iData){
current=current.leftNode;//往左走
if(current==null){
parent.leftNode=node;
return ;
}
}else{
current=current.rightNode;//往右走
if(current==null){
parent.rightNode=node;
return ;
}
}
}
}
/**
* 寻找后继节点*/
public Node getHouJi(Node deletNode){
Node HouJiParent=deletNode;
Node HouJi=deletNode;
Node current=HouJi.rightNode;
while(current!=null){
HouJiParent=HouJi;
HouJi=current;
current=current.leftNode;
}
if(HouJi!=deletNode.rightNode){
HouJiParent.leftNode=HouJi.rightNode;
HouJi.rightNode=deletNode.rightNode;
}
return HouJi;
}
/**
* 删除一个节点
* @param key 元素的关键字*/
public void deleteNode(int key){
Node parent=root;//删除节点的父节点
Node current=root;//删除的节点
boolean isLefteChild=false;//标记该删除的 元素时parent的左孩子还是右孩子
while(current.iData!=key){
parent=current;
if(key<current.iData){
//往左走
current=current.leftNode;
isLefteChild=true;
}else{
//往右走
current=current.rightNode ;
isLefteChild=false;
}
if(current==null){
System.out.println("删除失败,没有改节点");
return;
}
}//while
//如果该节点没有孩子,
if((current.leftNode==null)&&(current.rightNode==null)){
if(current==root){
root=null;
}
if(isLefteChild){
parent.leftNode=null;
return;
}else{
parent.rightNode=null;
return;
}
}
//如果有一个孩子,且为左孩子
if((current.rightNode==null)&&(current.leftNode!=null)){
if(current==root){
root=root.leftNode;
}else{
if(isLefteChild){
parent.leftNode=current.leftNode;
return ;
}else{
parent.rightNode=current.leftNode;
return ;
}
}
}
//如果有一个孩子,且为右孩子
if((current.rightNode!=null)&&(current.leftNode==null)){
if(current==root){
root=root.rightNode;
}else{
if(isLefteChild){
parent.leftNode=current.rightNode;
return ;
}else{
parent.rightNode=current.rightNode;
return ;
}
}
}
//如果删除的节点有两个孩子,
if((current.rightNode!=null)&&(current.leftNode!=null)){
//找到其后继节点
Node houJi=getHouJi(current);
if(current==root){
root=houJi;
}else if(isLefteChild){
parent.leftNode=houJi;
}else if(!isLefteChild){
parent.rightNode=houJi;
}
houJi.leftNode=current.leftNode;
}
}
/**
* 中序遍历树*/
public void center(Node root){
if(root!=null){
center(root.leftNode);
System.out.print(root.iData+" ");
center(root.rightNode);
}
}
public static void main(String args[]){
Tree tree=new Tree();
tree.insertNode(5,3);
tree.insertNode(48,3);
tree.insertNode(42,3);
tree.insertNode(32,3);
tree.insertNode(96,3);
tree.insertNode(79,3);
tree.insertNode(3,3);
tree.insertNode(78,3);
tree.insertNode(75,3);
tree.insertNode(25,3);
tree.insertNode(1,3);
tree.insertNode(4,3);
tree.center(tree.getRoot());
tree.deleteNode(48);
System.out.println();
tree.center(tree.getRoot());
}
}