树的层次遍历(BFS宽度优先搜索)

思路:先把根节点root加进队列,然后遵循“队头弹出一个节点,队尾加入该节点的所有孩子,循环此操作直至所有节点都弹出”的规律,把弹出的节点依次存入结果列表,最后将列表返回。
public class Main {

    public <E> List<List<TreeNode<E>>> levelOrder(TreeNode<E> x) {
        //存放结果的list
        List<List<TreeNode<E>>> res = new ArrayList<>();
        //存放结果的第一行的list
        List<TreeNode<E>> list = new ArrayList<>();
        Queue<TreeNode<E>> queue = new LinkedList<>();
        //标记上一行的最末节点
        TreeNode<E> last = x;
        //队列初始化
        queue.add(x);
        //标记最新加入队列的节点
        TreeNode<E> nLast = null;
        while (!queue.isEmpty()) {
            TreeNode<E> peek = queue.peek();
            //把即将弹出节点的子节点加入队列
            if (peek.children != null) {
                queue.addAll(peek.children);
                nLast = peek.children.get(peek.children.size() - 1);
            }
            //弹出,加入到当前层列表
            list.add(queue.poll());
            if (peek == last) {
                //如果现在弹出的节点是之前标记的最后节点,就要换列表
                res.add(list);
                list = new LinkedList<>();
                last = nLast;
            }
        }
        return res;
    }

    public static void main(String[] args) {

        //这是自己写的树实现类
        MyTree<String> tree = new MyTree<>(new TreeNode("a"));

        TreeNode<String> root = tree.getRoot();
        TreeNode<String> b = new TreeNode<>("b");
        tree.insertChild(root, b);
        TreeNode<String> c = new TreeNode<>("c");
        tree.insertChild(root, c);
        TreeNode<String> d = new TreeNode<>("d");
        tree.insertChild(root, d);

        TreeNode<String> e = new TreeNode<>("e");
        tree.insertChild(b, e);
        tree.insertChild(b, new TreeNode<>("f"));
        tree.insertChild(c, new TreeNode<>("g"));
        tree.insertChild(d, new TreeNode<>("h"));

        TreeNode<String> i = new TreeNode<>("i");
        tree.insertChild(e, i);

        tree.insertChild(i, new TreeNode<>("j"));
        

        List<List<TreeNode<String>>> lists = new Main().levelOrder(root);
        for (List<TreeNode<String>> list : lists) {
            for (TreeNode<String> treeNode : list) {
                System.out.print(treeNode.key);
            }
            System.out.println();
        }
    }
}

 

输出结果:

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值