二叉树每一层的最大值

Largest value in each level of a binary tree

好的,所以我正在研究我的算法和数据结构知识,并且我正在尝试在二叉树的每个级别中找到最大的数字。我不确定我这里的逻辑有什么问题。

class Solution
{
    int maxLevel = 0;
    public ArrayList<Integer> largestValues(Node root)
    {
        //code here
        ArrayList<Integer> arr = new ArrayList<>();
        
        checkHeight(root, 1, arr);
        return arr;
    }
    
    
    void checkHeight(Node root, int height, ArrayList<Integer> arr){
        if(root == null){
            return;
        }
        
        if(maxLevel < height){
            if(root.left != null && root.right != null){
                arr.add(Math.max(root.left.data, root.right.data));
            }
            if(root.left != null && root.right == null){
                arr.add(root.left.data);
            }
            if(root.left == null && root.right != null){
                arr.add(root.right.data);
            }
            if(root.left == null && root.right == null){
                return;
            }
            maxLevel = height;
        }
        
        checkHeight(root.left, height + 1, arr);
        checkHeight(root.right, height + 1, arr);
    }
    
}

看来您不熟悉二叉树每一层的最大数是什么意思。您当前的实现采用节点的左右子节点中最大的一个,如果它只有一个子节点,则该子节点。

二叉树中的一个级别由具有相同深度的所有节点组成,无论它们是否是同一父节点的直接子节点。

因此你的算法从根本上是错误的。

有两种方法可以解决这个问题:DFS 和 BFS。

BFS 更直接,至少在我看来是这样。这是怎么回事:

  1. 逐层遍历节点(BFS 设计这样做)。
  2. 取最大元素
  3. 进入下一个级别。

DFS 的工作原理如下:

  1. 保留一个字典,将级别作为键映射到级别中的最大数字作为值。
  2. 当你潜水 dfs 时,使用递归函数的参数跟踪深度。
  3. 在每个节点,如果当前节点更大,则更新该级别的键值。
  4. 最后将您的字典转换为您需要的任何格式。 注意:使用哪种类型的 DFS(有序、预序等)并不重要。只要确保访问每个节点并跟踪深度即可。