多叉树的样例

Posted 上官云霆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多叉树的样例相关的知识,希望对你有一定的参考价值。

工作中有关于菜单的处理,菜单即为多叉树的结构。该样例支持如下功能:
1.获取所有节点;
2.获取当前节点的所有子节点;
3. 获取当前节点的所有父节点 ;
4.获取同级字段;

package express.tree;


import com.alibaba.fastjson.JSONObject;

import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;

public class NodeTreeTraversalDemo 
    public static void main(String[] args) 
        List<Node> allList=new ArrayList<>();
        Node node1=new Node();
        node1.setId(1);
        node1.setLevel(1);
        node1.setParentId(0);

        Node node2=new Node();
        node2.setId(2);
        node2.setLevel(2);
        node2.setParentId(1);

        Node node3=new Node();
        node3.setId(3);
        node3.setLevel(3);
        node3.setParentId(2);

        Node node4=new Node();
        node4.setId(4);
        node4.setLevel(2);
        node4.setParentId(1);


        Node node5=new Node();
        node5.setId(5);
        node5.setLevel(4);
        node5.setParentId(3);

        Node node6=new Node();
        node6.setId(6);
        node6.setLevel(4);
        node6.setParentId(3);


        allList.add(node1);
        allList.add(node2);
        allList.add(node3);
        allList.add(node4);
        allList.add(node5);
        allList.add(node6);

        System.out.println("--------------所有节点的节点树--------------");

        List<Node> treeList=getTree(allList);
        String jsonStr = JSONObject.toJSONString(treeList);
        System.out.println(jsonStr);

        System.out.println("--------------获取id为2的所有子节点--------------");

        List<Node> childNodeList=getChildrenNode(2,allList);
        String childJsonStr = JSONObject.toJSONString(childNodeList);
        System.out.println(childJsonStr);

        System.out.println("--------------向上追溯获取id为3的所有父节点--------------");
        Map<Integer, Node> maps = allList.stream().collect(Collectors.toMap(Node::getId, Node->Node));
        List<Node>  parentNodeList=findAllParent(node3,maps);
        String  parentJsonStr = JSONObject.toJSONString(parentNodeList);
        System.out.println(parentJsonStr);

        System.out.println("---------------获取第2层的同级节点--------------");
        List<Node> sameLevelTreesList=findSameLevelNode(2,allList);
        String  sameLevelTreesJsonStr = JSONObject.toJSONString(sameLevelTreesList);
        System.out.println(sameLevelTreesJsonStr);

    

    /**
     * 获取所有节点
     * @param allList
     * @return
     */
    public static List<Node> getTree(List<Node> allList) 

        List<Node> treeList=new ArrayList<>();
        for (Node vo :allList)
            if (vo.getParentId()==0)
                vo.setChildren(getChildrenNode(vo.getId(), allList));
                treeList.add(vo);
            
        
        return treeList;
    

    /**
     * 递归获取子节点下的子节点
     * @param id 父节点的ID
     * @param treesList 所有菜单树集合
     * @return
     */
    private static List<Node> getChildrenNode(Integer id, List<Node> treesList) 
        List<Node> newTrees = new ArrayList<Node>();
        for (Node tmpNode : treesList) 
                if ("0".equals(tmpNode.getParentId())) 
                    continue;
                
                if (id.equals(tmpNode.getParentId())) 
                    // 递归获取子节点下的子节点,即设置树控件中的children
                    tmpNode.setChildren(getChildrenNode(tmpNode.getId(), treesList));
                    newTrees.add(tmpNode);
                

        
        return newTrees;
    

    /**
     * 给定节点查找该节点的所有父节点
     * @param node
     * @param data 存储的是所有的节点数据,key为该节点的Id,value为该node
     * @return
     */
    public static List<Node> findAllParent(Node node, Map<Integer,Node> data) 

        List<Node> res = new ArrayList<>();
        Stack<Node> stack = new Stack<>();
        stack.push(node);
        while(!stack.isEmpty())
            //弹出栈顶节点
            Node n  = stack.pop();
            if(n.getId().equals(n.getParentId())) 
                res.add(n);
                break;
            
            if(data.containsKey(n.getParentId()))
                Node parent = data.get(n.getParentId());
                res.add(n);
                stack.push(parent);
            else
                res.add(n);
            
        
        return res;
    

    public  static List<Node> findSameLevelNode(Integer level,List<Node> treesList)
        List<Node> sameLevelTreesList=new ArrayList<>();
        for (Node node: treesList)
            if(level.equals(node.getLevel()))
                sameLevelTreesList.add(node);
            
        
        return  sameLevelTreesList;
    






/**
 * 节点实体类
 */
class Node implements Serializable 


    /**
     * 主键
     */
    private Integer id;
    /**
     * 节点名称
     */
    private String name;
    /**
     * 节点编码
     */
    private String code;
    /**
     * 父id[根节点为0]
     */
    private Integer parentId;
    /**
     * 等级 [递增 根节点为0]
     */
    private Integer level;

    /**
     *   子树列表  -- 原本没有值
     */
    private List<Node> children ;

    public Integer getId() 
        return id;
    

    public void setId(Integer id) 
        this.id = id;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String getCode() 
        return code;
    

    public void setCode(String code) 
        this.code = code;
    

    public Integer getParentId() 
        return parentId;
    

    public void setParentId(Integer parentId) 
        this.parentId = parentId;
    

    public Integer getLevel() 
        return level;
    

    public void setLevel(Integer level) 
        this.level = level;
    

    public List<Node> getChildren() 
        return children;
    

    public void setChildren(List<Node> children) 
        this.children = children;
    

    @Override
    public boolean equals(Object obj) 
        if(this==obj)return  true;
        if(obj==null) return false;
        if(getClass()!=obj.getClass()) return false;
        Node node0bj=(Node) obj;
        if(id!=null)
        
            if(id.equals(node0bj.getId())
            )
                return  true;
            else
                return  false;
            
        else 
            return  false;
        

    

    @Override
    public int hashCode() 
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    

    @Override
    public String toString()

        return "id "+id+",name "+ name +",level " +level+",children "+children;

    

--------------所有节点的节点树--------------
["children":["children":["children":["children":[],"id":5,"level":4,"parentId":3,"children":[],"id":6,"level":4,"parentId":3],"id":3,"level":3,"parentId":2],"id":2,"level":2,"parentId":1,"children":[],"id":4,"level":2,"parentId":1],"id":1,"level":1,"parentId":0]
--------------获取id为2的所有子节点--------------
["children":["children":[],"id":5,"level":4,"parentId":3,"children":[],"id":6,"level":4,"parentId":3],"id":3,"level":3,"parentId":2]
--------------向上追溯获取id为3的所有父节点--------------
["children":["children":[],"id":5,"level":4,"parentId":3,"children":[],"id":6,"level":4,"parentId":3],"id":3,"level":3,"parentId":2,"children":["$ref":"$[0]"],"id":2,"level":2,"parentId":1,"children":["$ref":"$[1]","children":[],"id":4,"level":2,"parentId":1],"id":1,"level":1,"parentId":0]
---------------获取第2层的所有节点--------------
["children":["children":["children":[],"id":5,"level":4,"parentId":3,"children":[],"id":6,"level":4,"parentId":3],"id":3,"level":3,以上是关于多叉树的样例的主要内容,如果未能解决你的问题,请参考以下文章

多叉树的样例

多叉树的样例

多叉树的样例

简单的JAVA多叉树问题实现

c++多叉树的处理

javascript多叉树的实现