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

层次遍历:

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

1.把根放到队列中,

2,循环直到队列为空

1)把队首结点取出

2)把队首结点的左右孩子取出(无得话,不插入)

 //层次遍历
    public static void levelOrderTraversal(Node root){
        if(root==null){
            return;
        }
        Queue<Node> 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);
            }
        }
    }

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

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

  //层次遍历利用二维数组形式写出
    public static class Element{
        int level;
        Node node;
    }
    public static List<List<Character>>levelOrder(Node root){
        List<List<Character>> retList=new ArrayList<>();
        if(root==null){
            return retList;
        }
        Queue<Element> 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;
    }
发布了62 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43669007/article/details/100122281
今日推荐