Lucifer_can 2008-12-03 15:26
浏览 175
已采纳

树形结构算法

题目是这样的,有一段数组
static final String[] str={"aaa/bbb/ccc",
"aaa/ddd/eee",
"aaa/ddd/ooo",
"bbb/sss/xxx",
"eee/sss/aaa",
"aaa/eee/www",
"aaa/bbb/ccc/ddd",
"ccc/eee/www",
"ccc/eee/www/nnn"};

要求显示成

  • aaa
    • bbb
      • ccc
    • ddd
      • eee
      • ooo
  • bbb
    • sss
    ...........

帮我写写这个算法,我卡在这里1天了。其实也就是一个递归。

:cry: :cry: :cry:

  • 写回答

1条回答 默认 最新

  • xuxiaolei 2008-12-03 17:24
    关注

    [code="java"]
    package app;

    public class TreeDaoImpl {
    public String[] queryData() {
    return new String[] { "aaa/ddd/eee",
    "aaa/ddd/ooo",
    "bbb/sss/xxx",
    "eee/sss/aaa",
    "aaa/eee/www",
    "aaa/bbb/ccc/ddd",
    "ccc/eee/www",
    "ccc/eee/www/nnn"
    };
    }
    }

    [/code]

    [code="java"]
    package app;

    import java.util.List;
    import java.util.ArrayList;

    public class Node {

    private Object data;

    private Node parent;

    private List children;

    public Node() {  
        children = new ArrayList<Node>();  
    }  
    
    public Node(Object data, Node parent) {  
        this.data = data;  
        this.parent = parent;  
        children = new ArrayList<Node>();  
    }  
    
    public boolean hasChildren() {  
        return children.size() != 0;  
    }  
    
    public boolean containChildData(Object data) {  
        return queryChildByData(data) != null;  
    }  
    
    public Node queryChildByData(Object data) {  
        Node r = null;  
        for(Node node : children) {  
            if(node.getData().equals(data)) {  
                r = node;  
                break;  
            }  
        }  
    
        return r;  
    }  
    
    public void addChild(Node node) {  
        children.add(node);  
    }  
    
    public Object getData() {  
        return data;  
    }  
    
    public void setData(Object data) {  
        this.data = data;  
    }  
    
    public Node getParent() {  
        return parent;  
    }  
    
    public void setParent(Node parent) {  
        this.parent = parent;  
    }  
    
    public List<Node> getChildren() {  
        return children;  
    }  
    
    public void setChildren(List<Node> children) {  
        this.children = children;  
    }  
    

    }

    [/code]

    [code="java"]
    package app;

    public class TreeBuilder {

    private TreeDaoImpl dao = new TreeDaoImpl();
    private StringBuffer buffer = new StringBuffer();
    
    public Node generateTree() {
        String[] data = dao.queryData();
        Node root = new Node();
        Node parent = null;
    
        for(String e :data) {
            String[] s = parseData(e);
    
            parent = root;
            if(s != null || s.length > 0) {
                for(String f : s) {
    
                    Node node = null;
                    if(parent.containChildData(f)) {
                        node = parent.queryChildByData(f);
                    } else {
                        node = new Node(f, parent);
                        parent.addChild(node);
                    }
    
                    parent = node;
                }
            }
        }
    
        return root;
    }
    
    public String generateHtml(Node root) {
        if(root == null) {
            return "";
        }
    
        privateGenerateHtml(root, root);
        return buffer.toString();
    }
    
    public void privateGenerateHtml(Node parent, Node root) {
        if(parent == root) {
            buffer.append("<ul id=\"root\">");
        } else {
            buffer.append("<ul>");
        }
    
        for(int i = 0; i < parent.getChildren().size(); i++) {
            Node node = parent.getChildren().get(i);
            buffer.append("<li>" + node.getData() + "</li>");
            privateGenerateHtml(node, root);
        }
        buffer.append("</ul>");
    }
    
    public String[] parseData(String s) {
        String[] result = new String[0];
    
        if(s != null && s.indexOf("/") >= 0) {
            result = s.split("/");
        }
    
        return result;
    }
    
    public static void main(String[] args) {
        TreeBuilder tb = new TreeBuilder();
        Node root = tb.generateTree();
        String s = tb.generateHtml(root);
        System.out.println(s);
    }
    

    }

    [/code]

    [code="html"]

    • aaa
      • ddd
        • eee
          • ooo
          • eee
            • www
            • bbb
              • ccc
                • ddd
            • bbb
              • sss
                • xxx
              • eee
                • sss
                  • aaa
                • ccc
                  • eee
                    • www
                      • nnn

                  [/code]

                  本回答被题主选为最佳回答 , 对您是否有帮助呢?
                  评论

                报告相同问题?

                悬赏问题

                • ¥15 mmocr的训练错误,结果全为0
                • ¥15 python的qt5界面
                • ¥15 无线电能传输系统MATLAB仿真问题
                • ¥50 如何用脚本实现输入法的热键设置
                • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
                • ¥30 深度学习,前后端连接
                • ¥15 孟德尔随机化结果不一致
                • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
                • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
                • ¥15 谁有desed数据集呀