如何按层遍历二叉树【附java实现代码】

说道遍历二叉树,我们很容易就会想到按照前序中序后序以及按层来遍历二叉树。

这篇博客主要是记录一下按层来遍历二叉树的方法。

这个二叉树按照层来遍历的结果是

二叉树的遍历方法中,很多人最先想到的就是用递归的方法进行遍历。二叉树按层遍历也同样可以使用递归的方法进行遍历,这种方法有两个要点:1.要记录当前遍历的层数     2.每次递归的过程中判断该层是否已经遍历过

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */

上面是二叉树的结构定义。

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        //定义一个存放结果的数据结构
        List<List<Integer>> res = new ArrayList<>();
        if (null == root) {
            return res;
        }
        //用来记录层数的计数器
        int count = 0;
        levelOrder(root,res,count);
        return res;
    }
    public void levelOrder(TreeNode root,List<List<Integer>> res,int count) {
        //如果遍历的这个节点是空的则不需要操作和记录
        if (null == root) {
            return;
        }
        List<Integer> list;
        if (count >= res.size()) {//如果是没有遍历过的层,则创建新的List存放节点
            list = new ArrayList<Integer>();
            //把这个新建的List放入存放结果的数据结构中
            res.add(list);
        } else {//如果是正在遍历的层则从结果集中取出存放这层节点的List
            list = res.get(count);
        }
        //将节点的值放入List
        list.add(root.val);
        //递归地继续去按照从左至右的遍历节点的下一层
        levelOrder(root.left,res,count+1);
        levelOrder(root.right,res,count+1);
    }
}

按层遍历二叉树还可以借助队列来完成。这个方法的重点是每次将正在遍历的节点从队列中取出,并节点左右子树放入队列。

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        if (null == root) {
            return res;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            //记录遍历层的节点的数量
            int count = queue.size();
            List<Integer> list = new ArrayList<>();
            while (count > 0) { 
                //将节点从队列中取出
                TreeNode temp = queue.poll();
                list.add(temp.val);
                //如果节点存在左右子树,则将左右子树放入队列中
                if (null != temp.left) {
                    queue.add(temp.left);
                }
                if (null != temp.right) {
                    queue.add(temp.right);
                }
                //完成该节点的遍历,则计数器-1
                count--;
            }
            res.add(list);
        }
        return res;
    }
}
发布了10 篇原创文章 · 获赞 10 · 访问量 6637

猜你喜欢

转载自blog.csdn.net/zjg379569986/article/details/100983094