树型结构-改进前序遍历树

来源: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;

    }

         。。。。setter getter
二、模拟测试

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);

            }

        }

    }

}

 

lunzi   2007-09-18 17:55:27 评论:0   阅读:421   引用:0

发表评论>>

署名发表(评论可管理,不必输入下面的姓名)

姓名:

主题:

内容: 最少15个,最长1000个字符

验证码: (如不清楚,请刷新)

Copyright@2008 powered by YuLog