Java多叉树的创建,遍历,节点插入,删除,修改及节点路径获取

本文介绍了一个基于多叉树实现的书目分类管理系统,包括节点插入、遍历、删除及更新等核心功能,并提供了具体的方法实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 学生党一枚。最近课程设计做了个多叉树的书目分类管理系统。但愿有点用吧。。。

主菜单的代码就免了,我直接上方法咯 需要 测试代码的可留言
原创 可能会有很多不足 请多指教
转载请注明出处http://blog.youkuaiyun.com/sss1342746626/article/details/78868026

public class Node {
    private String id;          //结点id
    private String name;        //结点名称
    private List<Node> sonList; //该结点的 子结点集合

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public List<Node> getSonList() {
        return sonList;
    }

    public void setSonList(List<Node> sonList) {
        this.sonList = sonList;
    }
}
package com.lz.utils;
import com.lz.domain.Node;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by 白 on 2017/12/20.
 */
public class TreeUtils {

    /**
     * 插入新结点          输入父结点id进行定位 ,将新结点 插入到父结点的 sonList 中
     * @param changeNode  传入根结点,传入前需判断:若根结点不存在,待插入结点成为根结点,不必进入此方法
     * @param fatherId    新结点的 父结点id
     * @param newNode     新结点
     */
    public void insert(Node changeNode, String fatherId, Node newNode) {
        if (fatherId.equals(changeNode.getId())) {
            changeNode.getSonList().add(newNode);
            return;
        }

        List<Node> sonList = changeNode.getSonList();
        if (sonList == null || sonList.isEmpty()) {
            return;                            //若该结点 的子结点集合为空 返回
        } else {

            for (int i = 0; i < sonList.size(); i++) {
                insert(sonList.get(i), fatherId, newNode);
            }
        }

    }

    /**
     * 遍历结点 并打印. 同时按每个结点所在深度 在结点前打印不同长度的空格
     * @param changeNode    根结点
     * @param depth        结点深度:1
     */
    public void queryAll(Node changeNode, int depth){
        List<Node> sonList = changeNode.getSonList();
        String space = generateSpace(depth);    //根据深度depth,返回(depth*3)长度的空格

        if (sonList==null||sonList.isEmpty()){
            return;
        }

        for (int i = 0; i <sonList.size() ; i++) {
            System.out.println(space+"---"      //打印空格 和结点id,name
                    +"<"+sonList.get(i).getId()+">"
                    +sonList.get(i).getName());

            if(i==0){
                depth = depth+1;  //结点深度+1,每个for循环仅执行一次。作为子结点sonList.get(i)的深度
            }
            queryAll(sonList.get(i),depth);
        }

    }

    /**
     * 删除结点   注意:先判断 是否在删除 根结点. 若删除根结点,不必进入此方法 直接为null即可
     * @param changeNode 根结点
     * @param id         待删除结点id
     */
    public void delete(Node changeNode, String id) {
        List<Node> sonList = changeNode.getSonList();

        if (sonList == null || sonList.isEmpty()) {
            return;
        } else {

            for (int i = 0; i < sonList.size(); i++) {

                if(id.equals(sonList.get(i).getId())){
                    sonList.remove(i);
                    delete(new Node(),id);
                    break;
                }else{
                    delete(sonList.get(i), id);
                }

            }
        }

    }

    /**
     * 根据结点id  修改结点 name       //同理可根据结点name修改结点id
     * @param changeNode 根结点
     * @param id         结点id
     * @param name       修改后的 新name
     */
    public void update(Node changeNode, String id, String name) {
        if (changeNode.getId().equals(id)){
            changeNode.setName(name);
            return;
        }

        List<Node> sonList = changeNode.getSonList();
        if (sonList == null || sonList.isEmpty()) {
            return;
        } else {

            for (int i = 0; i < sonList.size(); i++) {
                update(sonList.get(i), id,name);
            }
        }

    }

    /**
     * 查询 某个结点 到根结点的路径
     * @param changeNode 根结点
     * @param name       待查找的结点 name
     * @param wayList    路径
     */
    public void queryWayById(Node changeNode, String name, ArrayList<String> wayList) {
        List<Node> sonList = changeNode.getSonList();

        wayList.add(changeNode.getName());
        if (sonList == null || sonList.isEmpty()) {
            return;
        } else {
            for (int i = 0; i < sonList.size(); i++) {

                if(name.equals(sonList.get(i).getName())){
                    for (int j = 0; j < wayList.size(); j++) {
                        System.out.print(wayList.get(j)+"->");
                    }
                    System.out.println(sonList.get(i).getName());
                    break;
                }
                queryWayById(sonList.get(i), name, wayList);

            }
        }

    }

    //打印空格
    public static String generateSpace(int count) {
        count = count*3;
        char[] chs = new char[count];
        for(int i = 0; i < count; i++) {
            chs[i] = ' ';
        }
        return new String(chs);
    }

}

效果如图 层次分明 结点越深 结点前方空格越长
效果如图 层次分明 结点越深 结点前方空格越长

评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值