节点类
public class SyTree {
//存储的数据
public double info;
//左子节点
public SyTree lTree = null;
//右子节点
public SyTree rTree = null;
//父节点
public SyTree pTree ;
public SyTree() {
super();
}
public SyTree(double info) {
super();
this.info = info;
}
public SyTree(double info, SyTree lTree, SyTree rTree, SyTree pTree) {
super();
this.info = info;
this.lTree = lTree;
this.rTree = rTree;
this.pTree = pTree;
}
public SyTree(SyTree pTree) {
super();
this.pTree = pTree;
}
public SyTree(double info, SyTree pTree) {
super();
this.info = info;
this.pTree = pTree;
}
@Override
public String toString() {
return "SyTree ";
}
}
———————————————————————————————————————————————————————————
二叉树类
import java.util.Arrays;
public class ArrayBinTree {
// 存放树的数组
public SyTree data[];
public SyTree root;
// 树的默认深度
public final int DEF_DEEP = 4;
public int treeDeep = 0;
public ArrayBinTree() {
super();
if (treeDeep == 0)
data = new SyTree[DEF_DEEP];
else {
treeDeep *= 2;
SyTree[] temp = new SyTree[treeDeep];
temp = Arrays.copyOf(data, data.length);
data = temp;
}
}
// 添加某一节点
public void insert(SyTree tree) {
if (root == null) {
root = tree;
} else {
SyTree current = root;
while (true) {
if (tree.info < current.info) {
if (current.lTree == null) {
current.lTree = tree;
tree.pTree = current;
return;
}
current = current.lTree;
} else {
if (current.rTree == null) {
current.rTree = tree;
tree.pTree = current;
return;
}
current = current.rTree;
}
}
}
}
// 删除某一节点(先插找到该节点,然后将相关节点的指向替换即可)
public void del(SyTree tree) {
SyTree current = root;
if (root == tree) {
current = root;
} else {
boolean flag = true;
SyTree temp = root;
while (flag) {
if (temp.info < tree.info) {
if (current.lTree == null)
return;
temp = current.lTree;
} else if (temp.info > tree.info) {
if (current.rTree == null)
return;
temp = current.rTree;
} else if (temp.info == tree.info) {
current = temp;
flag = false;
}
}
}
// 开始进行删除操作
if (current.lTree != null) {
if (current.lTree.lTree != null || current.lTree.rTree != null) {
SyTree temp = current.lTree;
while (true) {
// 如果temp符合条件
if (temp.rTree == null) {
// 如果其存在左子树,将其左子树移到其原来的位置
if (temp.lTree != null) {
if (temp.pTree.lTree == temp) {
temp.pTree.lTree = temp.lTree;
temp.lTree.pTree = temp.pTree;
} else {
temp.pTree.rTree = temp.lTree;
temp.lTree.pTree = temp.pTree;
}
}
// 将其移到目标的空缺位置
current.lTree.pTree = temp;
current.rTree.pTree = temp;
temp.lTree = current.lTree;
temp.rTree = current.rTree;
current = null;
return; // 删除完毕
}
temp = temp.rTree;
}
} else {
current.lTree.lTree = null;
current.lTree.rTree = current.rTree;
current.lTree.pTree = current.pTree;
current = null;
return;// 删除完毕
}
}
// 如果其左子树为空(类似于上面的)
else if (current.rTree != null) {
if (current.rTree.lTree != null || current.rTree.rTree != null) {
SyTree temp = current.rTree;
while (true) {
// 如果temp符合条件
if (temp.lTree == null) {
// 如果其存在左子树,将其左子树移到其原来的位置
if (temp.rTree != null) {
if (temp.pTree.rTree == temp) {
temp.pTree.rTree = temp.rTree;
temp.rTree.pTree = temp.pTree;
} else {
temp.pTree.lTree = temp.rTree;
temp.lTree.pTree = temp.pTree;
}
}
// 将其移到目标的空缺位置
current.rTree.pTree = temp;
current.lTree.pTree = temp;
temp.lTree = current.lTree;
temp.rTree = current.rTree;
current = null;
return; // 删除完毕
}
temp = temp.lTree;
}
}
//左右都无子树,直接删掉即可
else {
current = null;
return;// 删除完毕
}
}
}
}
———————————————————————————————————————————————————————————
主要用到C的指针思想
添加节点的方法和思想很简单就不说了。不懂百度。
删除节点:
1、先找到该节点所在位置(二分法查找应该很快捷);
2、判断目标节点有无左右子树,如果有左子树,就选取左子树最右边的一个节点来替换目标节点。(使用递归来获取)
3、如果目标节点无左子树,就选取其右子树最左边的节点来替换目标节点。(类似于步骤2,也采用递归来获取)
4、找到替换的后,还要判断该替换的节点有无子节点,有字节要将该字节先移到该节点所在位置,然后再进行替换操作。
5、将要替换的节点置空,等待垃圾回收器回收他。
________________________________________________________________________________________________________________
先存档,有问题以后再说。。。心情不好,就不验证能否正常使用了(反正主要学思想就行了)