我们建造一棵树首先要建造节点:
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.继续将队列里的节点弹出赋给指针。