public interface BinTreeInterface {
TreeNode SearchNode(int nodeIndex);//根据索引寻找节点
/**
*指定添加到哪个父节点的下面,如果那个位置有值则添加失败
*drection 为0则添加到左孩子 1为右孩子 nodeIndex为父节点位置
*/
boolean AddNode(int nodeIndex,int direction,TreeNode node);//添加节点
//删除它自己和与它相连的孩子
boolean DeleteNode(int nodeIndex,TreeNode node);//删除节点
void PreorderTraversal();//前序遍历
void InorderTraversal();//中序遍历
void PostorderTraversal();//后序遍历
}
public class TreeNode {
private int index;//坐标
private TreeNode left;//左节点
private TreeNode right;//右节点
private TreeNode parent;//父节点
private final DataType dataType;//数据类型
public TreeNode() {
index = 0;
left = null;
right = null;
parent = null;
dataType = new DataType();
}
public TreeNode SearchNode(int nodeIndex) {
if(this.getIndex()==nodeIndex) {
return this;
}
if(this.getLeft()!=null) {
if(this.getLeft().getIndex()==nodeIndex) {
//调试
//System.out.println("Delete:"+this.getLeft().getIndex());
return this.getLeft();
}else {
TreeNode tem = new TreeNode();
tem = this.getLeft().SearchNode(nodeIndex);
if(tem!=null) {
return tem;
}
}
}
if(this.getRight()!=null) {
if(this.getRight().getIndex()==nodeIndex) {
return this.getRight();
}else {
TreeNode tem = new TreeNode();
tem = this.getRight().SearchNode(nodeIndex);
if(tem!=null) {
return null;
}
}
}
return null;
}
//删除当前节点以及所连后面的所有节点
public void DeleteNode() {
if(this.getLeft()!=null) {
this.getLeft().DeleteNode();
}
if(this.getRight()!=null) {
this.getRight().DeleteNode();
}
if(this.getParent()!=null) {
if(this.getParent().getLeft()==this) {
this.getParent().setLeft(null);
}
if(this.getParent().getRight()==this) {
this.getParent().setRight(null);
}
}
//调试
//此时this不一定为你要删除的那个节点但是这个this的最终是
//由于其中有的this是通过个get的方式获得,不能修改
//this = null; error
// System.out.println("this:"+this);
}
public void PreorderTraversal() {
System.out.print(this.getDataType().data+" ");
if(this.getLeft()!=null)
this.getLeft().PreorderTraversal();
if(this.getRight()!=null)
this.getRight().PreorderTraversal();
}
public void InorderTraversal() {
if(this.getLeft()!=null)
this.getLeft().InorderTraversal();
System.out.print(this.getDataType().data+" ");
if(this.getRight()!=null)
this.getRight().InorderTraversal();
}
public void PostorderTraversal() {
if(this.getLeft()!=null)
this.getLeft().InorderTraversal();
if(this.getRight()!=null)
this.getRight().InorderTraversal();
System.out.print(this.getDataType().data+" ");
}
class DataType{
public int data = 0;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public TreeNode getLeft() {
return left;
}
public void setLeft(TreeNode left) {
this.left = left;
}
public TreeNode getRight() {
return right;
}
public void setRight(TreeNode right) {
this.right = right;
}
public TreeNode getParent() {
return parent;
}
public void setParent(TreeNode parent) {
this.parent = parent;
}
public DataType getDataType() {
return dataType;
}
}
public class BinTree implements BinTreeInterface{
private TreeNode Root;//根节点
public BinTree() {
Root = new TreeNode();//初始化根节点
}
//nodeIndex 为你要查找的节点的坐标
@Override
public TreeNode SearchNode(int nodeIndex) {
// TODO Auto-generated method stub
//通过调用节点自身的查找函数来实现
return Root.SearchNode(nodeIndex);
}
@Override
public boolean AddNode(int nodeIndex, int direction, TreeNode node) {
// TODO Auto-generated method stub
TreeNode temp = SearchNode(nodeIndex);
if(temp==null) {
//调试
System.out.println(nodeIndex);
return false;
}
TreeNode preNode = new TreeNode();
preNode.setIndex(node.getIndex());
preNode.getDataType().data = node.getDataType().data;
preNode.setParent(temp);
if(direction==0) {
temp.setLeft(preNode);
//调试
// System.out.println(preNode.getDataType().data);
}else {
temp.setRight(preNode);
//调试
// System.out.println(preNode.getDataType().data);
}
return true;
}
@Override
public boolean DeleteNode(int nodeIndex, TreeNode node) {
// TODO Auto-generated method stub
TreeNode temp = new TreeNode();
temp = SearchNode(nodeIndex);
if(temp==null) {
//调试
System.out.println(nodeIndex);
return false;
}
if(node!=null) {
node.getDataType().data = temp.getDataType().data;
}
temp.DeleteNode();
System.out.println("temp:"+temp);
temp = null;
return true;
}
@Override
public void PreorderTraversal() {
// TODO Auto-generated method stub
Root.PreorderTraversal();
//遍历内容在节点中完成
}
@Override
public void InorderTraversal() {
// TODO Auto-generated method stub
Root.InorderTraversal();
}
@Override
public void PostorderTraversal() {
// TODO Auto-generated method stub
Root.PostorderTraversal();
}
public static void main(String[] args) {
TreeNode node1 = new TreeNode();
node1.setIndex(1);
node1.getDataType().data = 1;
TreeNode node2 = new TreeNode();
node2.setIndex(2);
node2.getDataType().data = 2;
TreeNode node3 = new TreeNode();
node3.setIndex(3);
node3.getDataType().data = 3;
TreeNode node4 = new TreeNode();
node4.setIndex(4);
node4.getDataType().data = 4;
TreeNode node5 = new TreeNode();
node5.setIndex(5);
node5.getDataType().data = 5;
TreeNode node6 = new TreeNode();
node6.setIndex(6);
node6.getDataType().data = 6;
TreeNode node7 = new TreeNode();
node7.setIndex(7);
node7.getDataType().data = 7;
BinTree bt = new BinTree();
bt.AddNode(0, 0, node1);
bt.AddNode(0, 1, node2);
bt.AddNode(1, 0, node3);
bt.AddNode(1, 1, node4);
bt.AddNode(2, 0, node5);
bt.AddNode(2, 1, node6);
bt.AddNode(3, 0, node7);
bt.DeleteNode(2, null);
bt.PreorderTraversal();
System.out.println();
bt.PostorderTraversal();
System.out.println();
bt.InorderTraversal();
}
}