层次遍历二叉树(LeetCode--102二叉树的层次遍历)

题目

层次遍历一棵二叉树的节点

解题方法

在二叉树中经常会提到前序遍历、中序遍历和后序,会要求分别使用递归方法和非递归方法实现。层次遍历是经常被忽略的,而实际上层次遍历同样十分重要,是数据结构图论中图的广度优先遍历的基础。
我们使用递归迭代两种方法实现。

代码

递归方法
从根节点开始,记录当前遍历的节点以及所在的层次,并且递归的遍历其左孩子与右孩子(左孩子在右孩子之前调用,保证层次遍历的顺序性)。使用List>结构记录遍历过的节点,第i层的所有节点顺序存储在List>中下标为i的队列中。

public List> levelOrder(TreeNode root) {
    List> list = new LinkedList>();
    recursion(root, 0, list);
    return list;
}
//递归实现层次遍历
public void recursion(TreeNode root, int level, List> list){
    if (null == root){
        return;
    }
    if (level == list.size()){
        //如果返回结果的队列中,没有当前层次的存储队列,创建一个新的
        list.add(level, new ArrayList());
    }
    list.get(level).add(root.val);//当前节点放入当前层次的队列中
    //递归遍历先左孩子后右孩子
    recursion(root.left, level + 1, list);
    recursion(root.right, level + 1, list);
}

迭代方法
迭代方法与之前的对称二叉树中讲到的迭代方法类似,使用队列按照层次顺序记录遍历的节点,循环遍历各个层次即可。

public List> levelOrder(TreeNode root) {
    List> list = new LinkedList>();
    interation(root, list);
    return list;
}

public void interation(TreeNode root, List> list){
    if (root == null){
        return;
    }
    //队列按照层次顺序记录遍历的节点
    Queue queue = new LinkedList();
    //从根节点和0层开始
    queue.add(root);
    int level = 0;
    while(!queue.isEmpty()){
        int size = queue.size();//记录当前层次的节点个数
        List l = new ArrayList();
        for (int i = 0; i < size; ++i){
            TreeNode node = queue.poll();
            l.add(node.val);
            //下一层次的节点入队,等待下次循环遍历
            if (node.left != null){
                queue.add(node.left);
            }
            if (node.right != null){
                queue.add(node.right);
            }
        }
        list.add(level, l);//当前层次的结果存入结果队列中
        level++;//层次加1,遍历下一层次
    }
}

你可能感兴趣的:(层次遍历二叉树(LeetCode--102二叉树的层次遍历))