【数据结构】二叉树的层次遍历(java实现)

层次遍历:

从上到下再从左到右(树的广度优先,需要用到队列

  • 1.把根放到队列中,
  • 2,循环直到队列为空
  •    1)把队首结点取出
  •    2)把队首结点的左右孩子取出(无得话,不插入)
 //层次遍历
    public static void levelOrderTraversal(Node root){
        if(root==null){
            return;
        }
        Queue queue=new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            Node front=queue.remove();
            System.out.println(front.value);
            if(front.left!=null){
               queue.add(front.left);
            }
            if(front.right!=null){
                queue.add(front.right);
            }
        }
    }

还有一种方法是利用二维数组的形式写出,例如

【数据结构】二叉树的层次遍历(java实现)_第1张图片

方法1:写出二维数组的形式要一层一层进行打印,此时就需要二叉树的层数(层数从0开始),如果层数和二维数组的大小相等了,那就需要在二维数组中增加一个一位数组,进到下一层。其余和上述方法相似

  //层次遍历利用二维数组形式写出
    public static class Element{
        int level;
        Node node;
    }
    public static List>levelOrder(Node root){
        List> retList=new ArrayList<>();
        if(root==null){
            return retList;
        }
        Queue queue=new LinkedList<>();
        Element e=new Element();
        e.node=root;
        e.level=0;
        queue.add(e);
        while(!queue.isEmpty()){
            Element front=queue.remove();
            if(front.level==retList.size()){
                retList.add(new ArrayList<>());
            }
            retList.get(front.level).add(front.node.value);

            if(front.node.left!=null){
                Element l=new Element();
                l.node=front.node.left;
                l.level=front.level+1;
                queue.add(l);
            }
            if(front.node.right!=null){
                Element m=new Element();
                m.node=front.node.right;
                m.level=front.level+1;
                queue.add(m);
            }
        }
        return retList;
    }

方法2:与方法1类似(不用额外的去创建一个关于层数的类)

 public List> levelderBottom(Node root){
        LinkedList> result=new LinkedList<>();
        if(root==null){
            return result;
        }
        Queue queue=new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
            List oneLevel=new ArrayList<>();
            int count=queue.size();
            for(int i=0;i

 

你可能感兴趣的:(Java,数据结构)