来源:http://home.onwillow.com/archives/25.html
一、属性基本信息:
public class BaseNode {
private long id;
private int lft;
private int rgt;
private String name;
private String desc;
private int depth;
private int chflag;
public long getId() {
return id;
}
二、模拟测试
import java.util.ArrayList;
public class TestTree {
static ArrayList<BaseNode> tree = new ArrayList<BaseNode>();
public static void main(String[] args) {
int[] lfts = {1, 2, 3, 6};
int[] rgts = {8, 5, 4, 7};
int[] depths = {1, 2, 3, 2};
for (int i = 0; i < lfts.length; i++) {
BaseNode b = new BaseNode();
b.setId(i + 1);
b.setLft(lfts[i]);
b.setRgt(rgts[i]);
b.setName(String.valueOf(i + 1));
b.setDepth(depths[i]);
b.setChflag(0);
tree.add(b);
}
displayTree();
move(tree.get(2), tree.get(3));
displayTree();
}
public static void displayTree() {
System.out.println("---------------------------");
StringBuffer a = new StringBuffer();
for (Object aTree : tree) {
BaseNode o = (BaseNode) aTree;
for (int i = 0; i < o.getDepth(); i++) {
//a.append(" ");
}
a.append("<item name=\"").append(o.getName()).append("\"");
a.append(" lft=\"").append(o.getLft()).append("\"");
a.append(" rgt=\"").append(o.getRgt()).append("\"");
a.append(" depth=\"").append(o.getDepth()).append("\"");
if (o.getRgt() - o.getLft() == 1) {
a.append("/>");
} else {
a.append(">");
}
a.append("\n");
}
System.out.println(a.toString());
}
public static void move(BaseNode dest, BaseNode src) {
BaseNode vsrc = new BaseNode();
vsrc.setLft(src.getLft());
vsrc.setRgt(src.getRgt());
vsrc.setDepth(src.getDepth());
int _nodeSub = ((src.getRgt() - src.getLft() - 1) / 2 + 1) * 2;//节点个数
if (src.getRgt() < dest.getRgt()) {
BaseNode vnode = new BaseNode();
vnode.setLft(dest.getRgt() - 2);
vnode.setRgt(dest.getRgt() - 1);
vnode.setDepth(dest.getDepth() + 1);
int _stepSub = vnode.getRgt() - src.getRgt();
chSelfTree(vsrc, _stepSub, vnode.getDepth());
chLftOtherTree(vsrc, vnode, _nodeSub);
} else {
BaseNode vnode = new BaseNode();
vnode.setLft(dest.getLft() + 1);
vnode.setRgt(dest.getLft() + 2);
vnode.setDepth(dest.getDepth() + 1);
int _stepSub = vnode.getLft() - src.getLft();
chSelfTree(vsrc, _stepSub, vnode.getDepth());
chRgtOtherTree(vsrc, vnode, _nodeSub);
}
}
public static void chSelfTree(BaseNode src, int stepSub, int depth) {
int lft = src.getLft();
int rgt = src.getRgt();
int sdepth = src.getDepth();
System.out.println(lft + "," + rgt + "," + sdepth + "," + stepSub);
for (Object aTree : tree) {
BaseNode o = (BaseNode) aTree;
if (o.getLft() >= lft && o.getRgt() <= rgt) {
o.setLft(o.getLft() + stepSub);
o.setChflag(-1);
System.out.println(o.getId());
o.setDepth(o.getDepth() - sdepth + depth);
}
if (o.getRgt() >= lft && o.getRgt() <= rgt) {
o.setRgt(o.getRgt() + stepSub);
}
}
}
public static void chLftOtherTree(BaseNode src, BaseNode dest, int nodeSub) {
for (Object aTree : tree) {
BaseNode o = (BaseNode) aTree;
if (o.getLft() >= src.getRgt() && o.getLft() <= dest.getRgt() && o.getChflag() != -1) {
o.setLft(o.getLft() - nodeSub);
}
if (o.getRgt() >= src.getRgt() && o.getRgt() <= dest.getRgt() && o.getChflag() != -1) {
o.setRgt(o.getRgt() - nodeSub);
}
}
}
public static void chRgtOtherTree(BaseNode src, BaseNode dest, int nodeSub) {
for (Object aTree : tree) {
BaseNode o = (BaseNode) aTree;
if (o.getLft() >= dest.getLft() && o.getLft() <= src.getLft() && o.getChflag() != -1) {
o.setLft(o.getLft() + nodeSub);
}
if (o.getRgt() >= dest.getLft() && o.getRgt() <= src.getLft() && o.getChflag() != -1) {
o.setRgt(o.getRgt() + nodeSub);
}
}
}
}
