pushboy 2023-05-26 17:03 采纳率: 80%
浏览 22
已结题

一个树形结构的断层处理问题

有这样一些组织代码
code:001 001.001 001.002 001.001.001 001.002.001
或者是:001 001.002 001.003 001.004.001
或者是: 001 001.001 001.002.001 001.003.002 001.003.002.003 001.001.004.001
001是根节点,用.分割层次

如果是理想情况,如第一种,用递归很容易形成一棵树

001
    001.001
           001.001.001
   001.002
            001.002.001   

但是现在需要兼容其他情况,也就是如果没有找到父节点,就继续往上找,直到最后挂在根节点下
比如第二种情况就应该是

001
    001.002
    001.003
    001.004.001

第三种情况就应该是

001
    001.001
          001.001.004.001
    001.002.001
    001.003.002
          001.003.002.003
   

请问这种算法应该怎么写

  • 写回答

2条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-05-26 23:24
    关注

    该回答引用ChatGPT-3.5,仅供参考,不保证完全正确

    实现这种树形结构的断层处理算法可以使用递归来解决。下面是一个使用Java编写的示例代码,可以根据给定的组织代码构建一个树形结构:

    import java.util.HashMap;
    import java.util.Map;
    
    public class TreeBuilder {
        private TreeNode root;
    
        public TreeNode buildTree(String[] codes) {
            root = new TreeNode("001");
            Map<String, TreeNode> nodeMap = new HashMap<>();
            nodeMap.put(root.getCode(), root);
    
            for (String code : codes) {
                String[] parts = code.split("\\.");
                String parentCode = getParentCode(parts);
    
                TreeNode node = new TreeNode(code);
                TreeNode parent = nodeMap.get(parentCode);
    
                if (parent != null) {
                    parent.addChild(node);
                } else {
                    root.addChild(node);
                }
    
                nodeMap.put(code, node);
            }
    
            return root;
        }
    
        private String getParentCode(String[] parts) {
            StringBuilder parentCode = new StringBuilder();
    
            for (int i = 0; i < parts.length - 1; i++) {
                parentCode.append(parts[i]);
    
                if (i < parts.length - 2) {
                    parentCode.append(".");
                }
            }
    
            return parentCode.toString();
        }
    
        public void printTree(TreeNode node) {
            printTree(node, 0);
        }
    
        private void printTree(TreeNode node, int level) {
            StringBuilder indent = new StringBuilder();
            for (int i = 0; i < level; i++) {
                indent.append("    ");
            }
    
            System.out.println(indent + node.getCode());
            for (TreeNode child : node.getChildren()) {
                printTree(child, level + 1);
            }
        }
    
        public static void main(String[] args) {
            String[] codes = {"001", "001.001", "001.002", "001.001.001", "001.002.001"};
            TreeBuilder treeBuilder = new TreeBuilder();
            TreeNode root = treeBuilder.buildTree(codes);
            treeBuilder.printTree(root);
        }
    }
    
    class TreeNode {
        private String code;
        private List<TreeNode> children;
    
        public TreeNode(String code) {
            this.code = code;
            this.children = new ArrayList<>();
        }
    
        public String getCode() {
            return code;
        }
    
        public List<TreeNode> getChildren() {
            return children;
        }
    
        public void addChild(TreeNode child) {
            children.add(child);
        }
    }
    

    这个示例代码首先创建了一个根节点,并使用一个Map来存储节点对象,以便根据代码快速查找对应的节点。然后,遍历给定的组织代码,将每个代码分割成层次结构,并根据父节点的存在与否将节点添加到相应的位置。如果找不到父节点,则将节点添加到根节点下。


    最后,使用printTree方法打印整个树形结构,以验证结果。


    你可以根据需要修改示例代码,添加更多的功能或适应特定的业务需求。希望这可以帮助到你!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月4日
  • 已采纳回答 5月27日
  • 修改了问题 5月26日
  • 创建了问题 5月26日

悬赏问题

  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?