Java 二叉树的层序遍历

代码中的二叉树长这个样子↓↓↓
在这里插入图片描述

层序遍历的思路:
第①种思路:在一棵二叉树里面,层序遍历时先将根结点放入队列,当根结点的左和右不为空时,就弹出队首元素,再将根节点的左和右入队列,继续弹出队首元素,,,如此循环,直至层序遍历完该二叉树,若根结点的左和右为空的话,弹出队首元素后,打印,结束循环。
第②种思路:将每一层的数据都放进一个小list中,然后再将所有的list放进一个大的list中。
在这里插入图片描述

import java.util.*;
import java.util.Queue;
/*
class Node2{
    public char val;
    public Node left;
    public Node right;

    public Node2(char val) {
        this.val = val;
    }
}*/
public class LevelOrder {
    private static class Node{
        char val;
        Node left;
        Node right;

        public Node(char val) {
            this.val = val;
        }
    }
    public static Node buildTree(){
        Node A=new Node('A');
        Node B=new Node('B');
        Node C=new Node('C');
        Node D=new Node('D');
        Node E=new Node('E');
        Node F=new Node('F');
        Node G=new Node('G');
        Node H=new Node('H');
        A.left=B;A.right=C;B.left=D;B.right=E;//这里是构造二叉树的关键
        C.left=F;C.right=G;E.right=H;
        return A;
    }
    //层序遍历第一种方法
    //在一棵二叉树里面,层序遍历时先将根结点放入队列,当根结点的左和右不为空时,就弹出队首元素,再将根节点的左和右入队列,
    // 继续弹出队首元素,,,如此循环,直至层序遍历完该二叉树,若根结点的左和右为空的话,弹出队首元素后,打印,结束循环。
    public static void levelOrder(Node root){
        if(root==null){
            return;
        }
        Queue<Node> queue=new LinkedList<>(); //需要引入Queue包
        queue.offer(root);//当根结点不为空时,就将根结点入队列
        while(!queue.isEmpty()){ //当队列不为空时
            Node cur=queue.poll();//弹出队首元素,并将队首元素赋值给cur
            System.out.print(cur.val+" ");//打印队首元素
            if(cur.left!=null){
                queue.offer(cur.left);//如果根节点的左孩子不为空,就将该左孩子入队列
            }
            if(cur.right!=null){
                queue.offer(cur.right);//如果根节点的右孩子不为空,就将该右孩子入队列
            }
        }
        System.out.println();
    }
    //层序遍历第二种方法:返回值为list类型
    //将每一层的数据都放进一个list中,然后将这些list再放进一个大的list中
    public static List<List<Character>> levelOrder1(Node root){
        List<List<Character>> ret=new LinkedList<>();  //ret是大的list
        if(root==null){return ret;}
        Queue<Node> queue=new LinkedList<>();
        queue.offer(root);//将根结点入队列
        while(!queue.isEmpty()){
            // 1.求当前队列的大小,size
            int size=queue.size();//求队列当前的大小
            List<Character> list=new ArrayList<>();
            // 2.while(size>0)  ---->控制当前每一层的数据个数
            while(size>0) {
                Node cur = queue.poll();//当队列里有元素时,就将该队列的首元素出队列
                if(cur!=null){  //当cur的值不为空时
                    list.add(cur.val);//就将cur里的元素放进list里
                    if(cur.left!=null){
                        queue.offer(cur.left);//将cur.left入队列
                    }
                    if(cur.right!=null){
                        queue.offer(cur.right);
                    }
                }
                size--;//刚刚队列里面有一个元素,现在--后就没有了,所以跳出这层循环
            }
            ret.add(list);//将list里的元素放进大的list中
        }
        return ret;//最终队列为空时,循环终止,返回大list,若是代码看不懂就将代码仔细的口头运行一遍,会懂的!
    }
    public static void main(String[] args) {
        Node root=buildTree();
        System.out.printf("层序遍历:");
        levelOrder(root);
        System.out.println("层序遍历1:"+levelOrder1(root));

    }
}

执行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值