【Java】实现无限极树

1.Java具体实现步骤

1.1 实体类结构

package test;

import lombok.Data;
import java.util.List;

/**
 * @author deuses
 * @creat 2023-12-14
 */
@Data
class TreeNode {
    private Integer id;
    private String name;
    private Integer parentId;
    private List<TreeNode> children;

    public TreeNode(Integer id, String name, Integer parentId) {
        this.id = id;
        this.name = name;
        this.parentId = parentId;
    }
}

1.2 递归构建无限级树方法

package test;

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

/**
 * @author deuses
 * @creat 2023-12-14
 */
public class TreeBuilder {
    /**
     * 递归构建无限级树方法
     * @param nodeList 所有节点列表
     * @param parentId 父节点id
     * @return 封装好的父子节点树
     */
    public static List<TreeNode> buildTree(List<TreeNode> nodeList, Integer parentId) {
        List<TreeNode> tree = new ArrayList<>();
        for (TreeNode node : nodeList) {
            Integer id = node.getId();
            Integer pid = node.getParentId();
            if (parentId.equals(pid)) {
                //使用递归方法构建子节点树
                List<TreeNode> children = buildTree(nodeList, id);
                node.setChildren(children);
                tree.add(node);
            }
        }
        return tree;
    }
}

1.3 测试代码

package test;

import cn.hutool.json.JSONUtil;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.ArrayList;
import java.util.List;

/**
 * @author deuses
 * @creat 2023-12-14
 */
@SpringBootTest
public class TreeTest {

    @Test
    public void testTree(){
        TreeBuilder treeBuilder = new TreeBuilder();
        List<TreeNode> nodes = new ArrayList<>();
        nodes.add(new TreeNode(1, "Node 1", 0));
        nodes.add(new TreeNode(2, "Node 2", 1));
        nodes.add(new TreeNode(3, "Node 3", 1));
        nodes.add(new TreeNode(4, "Node 4", 2));
        nodes.add(new TreeNode(5, "Node 5", 2));

        List<TreeNode> treeNodes = TreeBuilder.buildTree(nodes, 0);
        System.out.println("treeNodes = " + JSONUtil.toJsonStr(treeNodes));
    }
}

1.4 输出效果

{
  "id": 1,
  "name": "Node 1",
  "parentId": 0,
  "children": [
    {
      "id": 2,
      "name": "Node 2",
      "parentId": 1,
      "children": [
        {
          "id": 4,
          "name": "Node 4",
          "parentId": 2,
          "children": []
        },
        {
          "id": 5,
          "name": "Node 5",
          "parentId": 2,
          "children": []
        }
      ]
    },
    {
      "id": 3,
      "name": "Node 3",
      "parentId": 1,
      "children": []
    }
  ]
}
  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
无限级树Java递归) 2007-02-08 10:26 这几天,用java写了一个无限极,递归写的,可能代码不够简洁,性能不够好,不过也算是练习,这几天再不断改进。前面几个小图标的判断,搞死我了。 package com.nickol.servlet; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.nickol.utility.DB; public class category extends HttpServlet { /** * The doGet method of the servlet. * * This method is called when a form has its tag value method equals to get. * * @param request the request send by the client to the server * @param response the response send by the server to the client * @throws ServletException if an error occurred * @throws IOException if an error occurred */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("utf-8"); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out .println(""); out.println(""); out.println(" Category" + "" + "body{font-size:12px;}" + "" + "" + ""); out.println(" "); out.println(showCategory(0,0,new ArrayList(),"0")); out.println(" "); out.println(""); out.flush(); out.close(); } public String showCategory(int i,int n,ArrayList frontIcon,String countCurrent){ int countChild = 0; n++; String webContent = new String(); ArrayList temp = new ArrayList(); try{ Connection conn = DB.GetConn(); PreparedStatement ps = DB.GetPs("select * from category where pid = ?", conn); ps.setInt(1, i); ResultSet rs = DB.GetRs(ps); if(n==1){ if(rs.next()){ webContent += "";//插入结尾的减号 temp.add(new Integer(0)); } webContent += " ";//插入站点图标 webContent += rs.getString("cname"); webContent += "\n"; webContent += showCategory(Integer.parseInt(rs.getString("cid")),n,temp,"0"); } if(n==2){ webContent += "\n"; }else{ webContent += "\n"; } while(rs.next()){ for(int k=0;k<frontIcon.size();k++){ int iconStatic = ((Integer)frontIcon.get(k)).intValue(); if(iconStatic == 0){ webContent += "";//插入空白 }else if(iconStatic == 1){ webContent += "";//插入竖线 } } if(rs.isLast()){ if(checkChild(Integer.parseInt(rs.getString("cid")))){ webContent += "";//插入结尾的减号 temp = (ArrayList)frontIcon.clone(); temp.add(new Integer(0)); }else{ webContent += "";//插入结尾的直角 } }else{ if(checkChild(Integer.parseInt(rs.getString("cid")))){ webContent += "";//插入未结尾的减号 temp = (ArrayList)frontIcon.clone(); temp.add(new Integer(1)); }else{ webContent += "";//插入三叉线 } } if(checkChild(Integer.parseInt(rs.getString("cid")))){ webContent += " ";//插入文件夹图标 }else{ webContent += " ";//插入文件图标 } webContent += rs.getString("cname"); webContent += "\n"; webContent += showCategory(Integer.parseInt(rs.getString("cid")),n,temp,countCurrent+countChild); countChild++; } webContent += "\n"; DB.CloseRs(rs); DB.ClosePs(ps); DB.CloseConn(conn); }catch(Exception e){ e.printStackTrace(); } return webContent; } public boolean checkChild(int i){ boolean child = false; try{ Connection conn = DB.GetConn(); PreparedStatement ps = DB.GetPs("select * from category where pid = ?", conn); ps.setInt(1, i); ResultSet rs = DB.GetRs(ps); if(rs.next()){ child = true; } DB.CloseRs(rs); DB.ClosePs(ps); DB.CloseConn(conn); }catch(Exception e){ e.printStackTrace(); } return child; } } --------------------------------------------------------------------- tree.js文件 function changeState(countCurrent,countChild){ var object = document.getElementById("level" + countCurrent + countChild); if(object.style.display=='none'){ object.style.display='block'; }else{ object.style.display='none'; } var cursor = document.getElementById("cursor" + countCurrent + countChild); if(cursor.src.indexOf("images/tree_minus.gif")>=0) {cursor.src="images/tree_plus.gif";} else if(cursor.src.indexOf("images/tree_minusbottom.gif")>=0) {cursor.src="images/tree_plusbottom.gif";} else if(cursor.src.indexOf("images/tree_plus.gif")>=0) {cursor.src="images/tree_minus.gif";} else {cursor.src="images/tree_minusbottom.gif";} var folder = document.getElementById("folder" + countCurrent + countChild); if(folder.src.indexOf("images/icon_folder_channel_normal.gif")>=0){ folder.src = "images/icon_folder_channel_open.gif"; }else{ folder.src = "images/icon_folder_channel_normal.gif"; }
实现一颗无限极可以通过递归的方式实现。具体思路如下: 1. 定义节点类,包含节点ID、节点名称、父节点ID、子节点列表等属性。 2. 创建节点列表,将根节点加入列表中。 3. 以递归的方式遍历节点列表,对于每个节点,根据其父节点ID查找父节点,将其加入父节点的子节点列表中。 4. 遍历完节点列表后,即可得到一颗完整的无限极。 以下是一个示例代码: ```java public class TreeNode { private int id; private String name; private int parentId; private List<TreeNode> children; public TreeNode(int id, String name, int parentId) { this.id = id; this.name = name; this.parentId = parentId; this.children = new ArrayList<>(); } // getter and setter public static void main(String[] args) { // 构造节点列表 List<TreeNode> nodeList = new ArrayList<>(); nodeList.add(new TreeNode(1, "节点1", 0)); nodeList.add(new TreeNode(2, "节点2", 1)); nodeList.add(new TreeNode(3, "节点3", 1)); nodeList.add(new TreeNode(4, "节点4", 2)); nodeList.add(new TreeNode(5, "节点5", 4)); // 递归构造 TreeNode root = new TreeNode(0, "根节点", -1); buildTree(root, nodeList); // 输出 printTree(root, 0); } // 递归构造 public static void buildTree(TreeNode parent, List<TreeNode> nodeList) { for (TreeNode node : nodeList) { if (node.getParentId() == parent.getId()) { parent.getChildren().add(node); buildTree(node, nodeList); } } } // 输出 public static void printTree(TreeNode node, int level) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < level; i++) { sb.append("-"); } System.out.println(sb.toString() + node.getName()); for (TreeNode child : node.getChildren()) { printTree(child, level + 1); } } } ``` 在上述示例代码中,我们定义了一个TreeNode类,其中包含节点ID、节点名称、父节点ID、子节点列表等属性。在main方法中,我们构造了一个节点列表,然后调用buildTree方法递归构造。最后调用printTree方法输出的结构。输出结果如下: ``` -根节点 --节点1 ---节点2 ----节点4 -----节点5 ---节点3 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Katakuri1125

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值