死磕二叉树(二)

102. 二叉树的层序遍历

二叉树层序遍历可以借助BFS的思想解决:

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {

    }
}

拿到这个题目之后,首先看到返回的类型是一个List<List<Integer>>,因此在构造返回结果的时候,结果也是按层进行添加的,也就是说,在处理的过程中需要保存当前访问的

// 构造返回结果
List<List<Integer>> res = new LinkedList<List<Integer>>();

// 动态添加值
List<Integer> list = new LinkedList<>();
res.add(list);

其次,为了达到层次遍历的效果,可以把二叉树的依次按层节点压入到队列中,再依次弹出使用:

Queue<TreeNode> queue = new LinkedList<TreeNode>();

TreeNode node = queue.poll();
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);

可以说,队列一次性保存了二叉树某个层的全部节点,一层一层的直到最底层:

public class Solution {
    // 迭代
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new LinkedList<List<Integer>>();
        if(root == null) return res;

        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);

        while (!queue.isEmpty()){
            List<Integer> list = new LinkedList<>();
            int level_length = queue.size();
            for (int i = 0; i < level_length; i++) {
                TreeNode node = queue.poll();
                list.add(node.val);
                if(node.left != null) queue.add(node.left);
                if(node.right != null) queue.add(node.right);
            }
            res.add(list);
        }

        return res;
    }
}

107. 二叉树的层次遍历 II

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

和上一题的唯一区别就是:每层的结点在结果中存放的先后顺序不同

稍微调整一下代码:

res.add(0, list);

剑指 Offer 32 - III. 从上到下打印二叉树 III

请实现一个函数按照之字形顺序打印二叉树

通过奇偶层的分离,就可以实现之字形打印的。在层序遍历中,res按保存了遍历的结果,因此可以借助res.size来区分奇偶层,也可以在循环外单独设置一个变量来指示当前的层数:

public class Solution {
    // 迭代
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new LinkedList<List<Integer>>();
        if(root == null) return res;

        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);

        int level = 0;
        while (!queue.isEmpty()){
            List<Integer> list = new LinkedList<>();
            int level_length = queue.size();
            for (int i = 0; i < level_length; i++) {
                TreeNode node = queue.poll();
                if (level % 2 == 0) list.add(node.val);
                else list.add(0, node.val);
                if(node.left != null) queue.add(node.left);
                if(node.right != null) queue.add(node.right);
            }
            res.add(list);
            level ++;
        }

        return res;
    }
}
原文地址:https://www.cnblogs.com/punnpkin/p/13575493.html