数据结构----树的广度遍历

数据结构中数是一种常见的数据组织方式,在许多的应用场景下体现出来了,比如说一个公司的Boss、总经理、副总经理、项目组长、项目组的组员,他们之间的关系就是一种树型结构,一个Boss下关联总经理,总经理关联多个副总经理,副总经理关联多个项目组长,项目组长关联多个组员。我们该如何去获取某一个员工的所有下级员工呢?比如:通过项目经理直接就可以获取到关联的项目组长以及项目组长下的组员。

这样就需要对于树进行遍历。遍历又可以分为广度遍历和深度遍历。

广度遍历就是按层进行遍历,针对于下面这个树,其广度遍历的输出结果为:FCEADHGBM,按层遍历就是先输出一次层,第一层输出完毕以后第二层,第二层完成后进行第三层的输出,以此类推,直到最后一层,树的广度遍历就结束了。

 实现的思路,可以通过循环的递归实现,通过循环实现的话,需要借助队列。

具体的流程:将根节点F放入到队列中

                      将F的左孩子和右孩子加入队列,F出队列。

                       然后从队列中获取到出队的元素,目前队列出队的元素是C,则将C的左右孩子加入队列,C出队列。

                     接下来,E入队,H和G加入队列,然后E出队。

                     以此类推,直到队列中没有元素,则树遍历完成

具体代码实现


public class Test {
    public static void main(String[] args) {
        Node node1 = new Node(null,null,1);//根节点
        Node node2 = new Node(null,null,2);
        Node node3 = new Node(null,null,3);

        node1.addLeft(node2);
        node1.addRight(node3);

        Node node4 = new Node(null,null,4);
        Node node5 = new Node(null,null,5);
        node2.addLeft(node4);
        node2.addRight(node5);


        Node node6 = new Node(null,null,6);
        Node node7 = new Node(null,null,7);
        node3.addLeft(node6);
        node3.addRight(node7);


        Node.print(node1);


    }
}

//定义树的节点,left为该节点的左孩子,right为该节点的右孩子。value为该节点的内容
class Node{
    Node left;
    Node right;
    Integer value;

    public Node(Node left, Node right, Integer value) {
        this.left = left;
        this.right = right;
        this.value = value;
    }

    public void addLeft(Node left){
        this.left = left;
    }

    public void addRight(Node right){
        this.right = right;
    }

//用来打印某个节点下的所有子节点
/*
使用ArrayList作为队列,元素没有真正的出队,只不过是通过index变量,使index下标后移,可以将index之前的元素看作是已经出队的元素,index为队列的出队元素,index后面的元素看作是队列中的元素
所以当index大于队列的长度时,说明队列中已经没有元素了,这时候树的所有节点就遍历完成了。
*/


    public static void print(Node node){
      List<Node> queue = new ArrayList<Node>();//队列
        queue.add(node);//添加根节点的值到队列中
        int index = 0;//队列中出队元素的下标
        while(true){
            if(node.left!=null){
                queue.add(node.left);
            }
            if(node.right!=null){
                queue.add(node.right);
            }
            index++;
            if(index>=queue.size()){
                break;
            }
            node = queue.get(index);

        }

        for (Node node1 : queue) {
            System.out.print(node1.value+" ");
        }



    }

}

以上就是我对于树的遍历的理解,如果表述有问题,欢迎留言

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值