实现二叉树的按层序遍历

85 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

给定一棵树的头结点,然后遍历打印它的每一层

思路

这个题目的思路就是拿到父亲节点,然后把孩子节点塞进去,那么我们就需要一个数据结构来保存我们的父亲节点还有孩子节点,现在我们知道的数据结构就是栈,队列,哈希......

我们的想法就是一个容器,吐出父亲节点,然后父亲节点找到孩子节点再放进去,这个就和队列是差不多的样子,那我们知道这个之后,我们就可以用队列来解决问题了。

先压入头节点,然后进入循环,从队列里面弹出一个节点,首先打印这个节点,然后放左节点,放右节点

以此往复直到队列里面没有节点的时候就结束了。

代码

节点类

public static class Node {
    public int value;
    public Node left;
    public Node right;

    public Node(int v) {
        value = v;
    }
}

方法代码

public static void level(Node head) {
    //判空
    if (head == null) {
        return;
    }
    //注意点1
    Queue<Node> queue = new LinkedList<>();
    queue.add(head);
    while(!queue.isEmpty()){
        //注意点2
        Node cur = queue.poll();
        System.out.print(cur.value + " ");
        //注意点3
        if(cur.left != null){
            queue.add(cur.left);
        }
        if(cur.right != null){
            queue.add(cur.right);
        }
    }
}

上面还是有一点需要注意的地方的。

注意点1:这个地方需要注意的是Queue是个接口,不能用来实现类,所以用到了LinkedList,大家也可以用其他的来实现队列。

注意点2:这边要注意了,这个地方是poll不是peek,因为我们弹出之后这个元素除了打印还有把儿子带过来就没有其他的用处了。

注意点3:这个注意点就是先放左边后放右边要不然就不对了。

延展

这边可以延展的地方还是很多的。比如怎么用栈来实现按层遍历。这个就是我在前面有个博客写到的,用两个栈来实现队列,然后用队列的特性来实现树的按层序遍历。

结语

看到这里的小伙伴就点个赞吧,我也会去点赞大家的博客的,大家互相进步