递归法求解二叉树每一层的最大值

656 阅读2分钟

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

递归法求解二叉树每一层的最大值

今天我们继续学习和二叉树有关的算法,这次的主题是我们如何使用递归法求解二叉树每一层的最大值。

话不多说,咱们直接开始学习!

题目分析

这里题目要求就是对于给定的一棵二叉树,我们需要用递归的方法去求得它每一行(即每一层)的最大值。

注意这里已经要求使用递归法了,所以在设计算法的时候就需要使用到递归。

算法设计分析

因为要求使用递归方法,所以整个过程将会是一个深度遍历的过程,也就是说它并不会是一层一层地进行处理,而是在不同深度间不断递归或者回溯,所以我们需要记录着哪里的结点是哪一层的,在同一层的结点中就可以不断地取最大值,其他以此类推,这样的话,等该层的所有节点都处理完的时候,所记录的就是每一层当中的一个最大值了,也就顺利完成了整个题目要求了。

算法代码的具体实现:

首先我们需要定义一个容器来记录二叉树不同层中的最大值:

List<Integer> list = new ArrayList<>();

递归调用函数:

public List<Integer> largestValues(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        recursion(root, list, 0);
        return list;
   }

递归函数,如下所示:

public void recursion (TreeNode root, List<Integer> list, int deep) {
        // 递归终止条件
        if (root == null) {
            return;
        }
​
        // 单层递归逻辑
        int size = list.size();
​
        if (size > deep) {
            list.set(deep, Math.max(list.get(deep), root.val));
        } else {
            list.add(root.val);
        }
​
        recursion(root.left, list, deep + 1);
        recursion(root.right, list, deep + 1);
    }

上述中,size记录的是当前已经记录的层(深度),deep记录的是当前已经到达的层次(深度)了,只要当前已经记录的深度比当前已经达到的深度小,则就需要增加容量用于记录新层的结点值;如果是小于的话,就证明了曾经已经记录过当前层的结点,所以在这种情况下,只需要二者中取一个最大的记录即可。

算法总结:

今天我们学习了如何使用递归的方法去求解二叉树每一层当中的最大值,这里主要是一种递归深度遍历的思想,在遍历的过程中需要额外记录深度来判断处理。

相信每一位能够看到这里的朋友都会有属于自己的收获。