java树形结构递归实现_数据结构之单链表Java实现

最近,正在看一本《大话数据库结构》,发现和我上大学学习的相似度非常高,只不过都是通过C语言进行展示的,之前不是很熟悉开发语言;目前从事java,所以想通过java来实现一次

1.Student类:

public class Student {    private String name;    private Student next;     public String getName() {        return name;    }     public void setName(String name) {        this.name = name;    }     public Student getNext() {        return next;    }     public void setNext(Student next) {        this.next = next;    }}

2.操作Student类的链表类:

public class SingleList {    private Student student = new Student();    //相当于头结点    private Student s = student;    private int length = 0;      public void add(Student stu){        s.setNext(stu);        s = s.getNext();        ++length;    }     public void getAll(){        Student node = student;        while ((node = node.getNext()) != null){            System.out.println(node.getName());        }    }     public Student get(int i){        Student node = student;         if(i > length){            return null;        }        int j = 0;        while(i < length && j < i){            j++;            node = node.getNext();        }        return node;    }    public Student get(){        return s;    }    public Student remove(){        Student node = student;        int j = 0;        while(j < length-1){            j++;            node = node.getNext();        }        Student ele = node.getNext();        node.setNext(null);        s = node;        length--;        return  ele;    }    public void add(int i, Student stu){        Student node = student;        int j = 0;        if(i > length){            System.out.println("位置超过链表最大位置");        }else if(i == length){    //如果在末尾增加            add(stu);        }else{            while(j < i){                j++;                node = node.getNext();            }            stu.setNext(node.getNext());            node.setNext(stu);            length++;        }    }    public Student remove(int i){        if(i > length){            return null;        }else if(i == length){            return remove();        }else{            Student node = student;            int j = 0;            while(j < i-1){                j++;                node = node.getNext();      //node最大为第i-1个位置            }            Student stu = node.getNext();   //stu为第i个位置            node.setNext(stu.getNext());            length--;            return stu;        }    }    public Student getStudent() {        return student;    }    public void setStudent(Student student) {        this.student = student;    }    public int getLength() {        return length;    }    public void setLength(int length) {        this.length = length;    }    public Student getS() {        return s;    }    public void setS(Student s) {        this.s = s;    }}

前只是对单链表进行实现,线性表的顺序存储结构相当于操作数据,暂不进行实现

e6812f69d85ecdc663f87ece6dfa03fd.png

一步一个脚印

/** * 根据等级查询类目树 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目树,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为树结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装树 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级树返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
/* * 基于链表实现树结构 */ package dsa; public class TreeLinkedList implements Tree { private Object element;//树根节点 private TreeLinkedList parent, firstChild, nextSibling;//父亲、长子及最大的弟弟 //(单节点树)构造方法 public TreeLinkedList() { this(null, null, null, null); } //构造方法 public TreeLinkedList(Object e, TreeLinkedList p, TreeLinkedList c, TreeLinkedList s) { element = e; parent = p; firstChild = c; nextSibling = s; } /*---------- Tree接口中各方法的实现 ----------*/ //返回当前节点中存放的对象 public Object getElem() { return element; } //将对象obj存入当前节点,并返回此前的内容 public Object setElem(Object obj) { Object bak = element; element = obj; return bak; } //返回当前节点的父节点;对于根节点,返回null public TreeLinkedList getParent() { return parent; } //返回当前节点的长子;若没有孩子,则返回null public TreeLinkedList getFirstChild() { return firstChild; } //返回当前节点的最大弟弟;若没有弟弟,则返回null public TreeLinkedList getNextSibling() { return nextSibling; } //返回当前节点后代元素的数目,即以当前节点为根的子树的规模 public int getSize() { int size = 1;//当前节点也是自己的后代 TreeLinkedList subtree = firstChild;//从长子开始 while (null != subtree) {//依次 size += subtree.getSize();//累加 subtree = subtree.getNextSibling();//所有孩子的后代数目 } return size;//即可得到当前节点的后代总数 } //返回当前节点的高度 public int getHeight() { int height = -1; TreeLinkedList subtree = firstChild;//从长子开始 while (null != subtree) {//依次 height = Math.max(height, subtree.getHeight());//在所有孩子中取最大高度 subtree = subtree.getNextSibling(); } return height+1;//即可得到当前节点的高度 } //返回当前节点的深度 public int getDepth() { int depth = 0; TreeLinkedList p = parent;//从父亲开始 while (null != p) {//依次 depth++; p = p.getParent();//访问各个真祖先 } return depth;//真祖先的数目,即为当前节点的深度 } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值