迭代法求二叉树每一层的最大值

113 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第37天,点击查看活动详情 >>

迭代法求二叉树每一层的最大值

在这之前我们已经讲述过如何使用递归法去求解二叉树每一层的最大值(里面包含一个题目的完整分析过程)如果已经忘记了这些的朋友可以先去复习一下之前的知识点,再来学习今天的内容,这样子的话,学习起来就会更加事半功倍的。

话不多说,咱们直接进入今天的正题内容!

算法分析

这一次题目要求的是要使用迭代法去求解二叉树每一层的最大值,一般来说,如果是在二叉树中要按照层级来处理的话,迭代法会比递归法要好处理很多的,这道题的算法也不例外。

它要求每一层的最大值,那么我们只需要在每一层的迭代当中记录住该层级的最大值即可,因为迭代法,所以是使用层次遍历的二叉树遍历,这样的话,要在每一层中找出最大值是非常方便快捷的。

下面我们一起来看看迭代求解的算法具体实现。

算法代码的具体实现:

在实现算法的过程中,我们是要使用到队列这个数据结构的,因为使用队列可以比较方便地实现二叉树的层次遍历。

定义队列并对队列进行初始化:

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

下面我们来看看完整代码的实现:

public List<Integer> largestValues(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if (root == null) {
            return list;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            int size = queue.size();
            int max = Integer.MIN_VALUE;
            while (size > 0) {
                TreeNode poll = queue.poll();
                size--;
                if (poll != null) {
                    max = Math.max(max, poll.val);
                    if (poll.left != null) {
                        queue.add(poll.left);
                    }
                    if (poll.right != null) {
                        queue.add(poll.right);
                    }
                }
            }
            list.add(max);
        }
        return list;
    }

通过上面代码我们会发现,在迭代每一层的过程中,总会有一个变量不断地统计着该层的最大值的,它就是max,只要还是遍历当前层的结点,那么它的值就可能是一直迭代,每一次都是记录最大值;直到当前层遍历结束后,那么现在max记录的就是该层的最大值,这时候只需要将max的值添加到list中保存即可。

总结:

本次文章带着大家一起学习了通过迭代算法如何求解二叉树每一层的最大值,相信大家学习完之后都会觉得迭代求解会比递归求解更容易理解。

其实这最主要的原因是在迭代算法中使用到了层次遍历,这样一层一层地来就和题目要求的求每一层的最大值刚好契合。