Bootstrap

使用Java进行树的深度遍历与广度遍历

我们建造一棵树首先要建造节点:
1.在这里我们不仅仅局限于二叉树,他可能有多个子节点,这些节点使用一个list来存放。
2.当然每个节点必须要有值 value。
所以一个节点最基本的属性就是存放值的value以及存放下一个节点地址的list。
先建一个节点类

  class Node01<T> {
    private final List<Node01<T>> childrenS = new ArrayList<>();
    private T value;
    }

然后我们给他加上get与set方法以及构造方法:

    public Node01(T value) {
        this.value = value;
    }

    public List<Node01<T>> getChildrenS() {
        return childrenS;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }

  

    public boolean addChildren(Node01<T> children) {
        if (childrenS.contains(children))
            return false;
        childrenS.add(children);
        return true;
    }

这里的最后一个方法addchindren()是为了判断这个节点是否以及添加过,
如果添加过就不添加该节点并返回一个布尔值。
然后我们需要自己构建这颗树,这里为什么不创建一个树类的原因是因为这棵树的没有添加规则,像其他的例如搜索二叉树等树都有自己的添加规则。
然后在main方法里
1.创建节点对象,并将这些节点互相嵌套以形成一棵树
2.第一个节点命名为root 意思是根节点 我们遍历就需要从根节点进入

        Node01 root = new Node01(00);
        Node01 children1_1 = new Node01(11);
        Node01 children1_2 = new Node01(12);
        Node01 children1_3 = new Node01(13);
        Node01 children2_1 = new Node01(21);
        Node01 children2_2 = new Node01(22);
        Node01 children2_3 = new Node01(23);
        Node01 children2_4 = new Node01(24);
        Node01 children2_5 = new Node01(25);
        Node01 children3_1 = new Node01(31);
        Node01 children3_2 = new Node01(32);
        Node01 children3_3 = new Node01(33);
        Node01 children4_1 = new Node01(41);
        Node01 children4_2 = new Node01(42);
        root.addChildren(children1_1);
        root.addChildren(children1_2);
        root.addChildren(children1_3);

        children1_1.addChildren(children2_1);
        children1_1.addChildren(children2_2);

        children1_2.addChildren(children2_3);
        children1_2.addChildren(children2_4);

        children1_3.addChildren(children2_5);

        children2_1.addChildren(children3_1);
        children2_1.addChildren(children3_2);

        children2_2.addChildren(children3_3);

        children3_1.addChildren(children4_1);
        children3_1.addChildren(children4_2);

在这里插入图片描述
这就是这棵树的结构
然后我们来写两个方法对他们进行深度遍历与广度遍历

public static void depthErgodic(Node01<T> root) {//深度遍历
        if (root == null) return;
        System.out.print(root.getValue()+" ");
        for (Object node:
                root.getChildrenS()) {
            depthErgodic((Node01) node);
        }
    }

深度遍历十分简单 ,
1.把根节点放进来,如果节点为空就return,如果不为空输出这个节点的value。
2.然后for循环遍历这个节点里的list,取出里面存放的所有节点然后进行递归
直到全部退出递归。
在这里描述一下深度遍历
深度优先搜索:沿着树的深度遍历树的所有节点,尽可能搜索树的分支,当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。
如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。


然后就是广度优先遍历:

要求从上向下从左到右依次打印出来,也就是0,1,2,3,4,5,6,7,8,9,是从根结点开始沿着树的宽度搜索遍历

public static void scopeErgodic(Node01 root) {//广度遍历
        Queue<Node01<T>> queue = new LinkedList<>();
        queue.add(root);
        Node01<T> tree;
        tree = queue.poll();
        while (null != tree) {
            System.out.print(tree.getValue()+" ");
            for (Node01 tr :
                    tree.getChildrenS()) {
                queue.offer(tr);
            }
            tree = queue.poll();
        }

    }

大家都知道队列是先进先出的,我们就利用他的特性来进行广度遍历
1、开始还是先将根节点放入队列 然后建立一个节点指针::Node tree;
2.用这个指针节点来接收队列里弹出来的节点
3.这个节点如果不为空就继续循环,输出该节点的value,然后遍历该节点里的list取出节点存入队列中
3.继续将队列里的节点弹出赋给指针。
在这里插入图片描述

在这里插入图片描述

;