java多叉树

1.建立节点对象
<wiz_code_mirror>
 
 
 
 
 
@Getter
@Setter
@Builder(builderClassName = "NodeBuilder")
@NoArgsConstructor
@AllArgsConstructor
public class Node {
    private Node parent;
    private String name;
    private int rank; //同级排行
    private int level;//层级
    private List<Node> childrens=new ArrayList<Node>();
}
 
 
2.插入对象   先插入3层每层3个子节点
<wiz_code_mirror>
 
 
 
 
 
   @Test
    public void addNode(){
        Node.NodeBuilder builder = Node.builder();
        Node a = builder.level(1).name("a").rank(1).parent(null).childrens(new ArrayList<Node>()).build();
        createTree(a);
//        queryTree(a);//从上往下一直查找再返回上一层查找
        querylevelTree(a);//一层一层查找
        return;
    }
public void createTree(Node parent){
            if(parent.getLevel()>2){//建立3层 父节点层级大于2就退出
                return;
            }else {
                for (int i = 0; i < 3; i++) {
                    int level = parent.getLevel() + 1;
                    Node node = createNode(level, "a" + level +parent.getRank() +"-"+i, parent,i);
                    parent.getChildrens().add(node);
                    createTree(node);//递归建立子节点
                }
            }
    }
 
    public Node createNode(int level,String name,Node parent,int rank){
        Node.NodeBuilder builder = Node.builder();
        Node a = builder.level(level).name(name).childrens(new ArrayList<Node>()).parent(parent).rank(rank).build();
        return a;
    }
 
 
3.查找子节点方法一(从顶部往底部查找)
<wiz_code_mirror>
 
 
 
 
 
public void queryTree(Node a){
        System.out.println(a.getName());
        if(a.getChildrens()!=null&&a.getChildrens().size()>0){
            List<Node> childrens = a.getChildrens();
            for(int i = 0; i< childrens.size();i++){
                queryTree(childrens.get(i));
            }
        }else {//没有子节点退出循环
            return;
        }
   }
 
 
输出
a
a21-0
a30-0
a30-1
a30-2
a21-1
a31-0
a31-1
a31-2
a21-2
a32-0
a32-1
a32-2
4.查找子节点方法二(一层一层查找)
<wiz_code_mirror>
 
 
 
 
 
 public void querylevelTree(Node a){
        if(a.getChildrens()!=null&&a.getChildrens().size()>0){
            List<Node> childrens = a.getChildrens();
            for(int i = 0; i< childrens.size();i++){//先把当前层查找完  再查找下一层
                System.out.println(childrens.get(i).getName());
            }
            for(int i = 0; i< childrens.size();i++){//查找下一层
                querylevelTree(a.getChildrens().get(i));
            }
        }else {//没有子节点退出循环
            return;
        }
    }
 
 
输出
a21-0
a21-1
a21-2
a30-0
a30-1
a30-2
a31-0
a31-1
a31-2
a32-0
a32-1
a32-2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java多叉树可以用于构建家谱,以下是一个简单的实现示例: ```java class Person { private String name; private List<Person> children; public Person(String name) { this.name = name; this.children = new ArrayList<>(); } public String getName() { return name; } public void addChild(Person child) { this.children.add(child); } public List<Person> getChildren() { return children; } } public class FamilyTree { private Person root; public FamilyTree(String name) { this.root = new Person(name); } public Person getRoot() { return root; } public void addPerson(Person parent, Person child) { parent.addChild(child); } public static void main(String[] args) { FamilyTree familyTree = new FamilyTree("张三"); Person parent1 = familyTree.getRoot(); Person child1 = new Person("李四"); familyTree.addPerson(parent1, child1); Person parent2 = child1; Person child2 = new Person("王五"); familyTree.addPerson(parent2, child2); System.out.println(familyTree.getRoot().getName()); for (Person child : familyTree.getRoot().getChildren()) { System.out.println(" " + child.getName()); for (Person grandChild : child.getChildren()) { System.out.println(" " + grandChild.getName()); } } } } ``` 在上面的示例中,`Person`类代表一个人,每个人有一个名字和多个子节点,即其子女。`FamilyTree`类代表家谱,其中`root`字段为根节点,表示家谱的起始人物。`addPerson`方法用于向家谱中添加人物。在`main`方法中,先创建家谱的起始人物张三,然后添加李四作为其子女,再添加王五作为李四的子女。最后,通过遍历树的方式输出家谱的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值