返回

1161. 最大层内元素和:层序遍历求最大元素和的层

后端

刷LeetCode题库:求最大层内元素和(1161)



题目概述

求一棵二叉树中最大元素和所在的层。


题目

给定一个二叉树,找出其最大元素和所在的层。

二叉树的层级是从1开始的,最低层是1,其父节点的层级是父节点层级的下一层。

返回包含最大元素和的层。如果有多个答案,返回其中一个即可。

示例:

给定二叉树:[1,7,0,7,-8,null,9]

              1
             / \
            7   0
           / \
          7  -8
             /
            9

返回:2

提示:

  • 树的结点数介于1和1000之间。
  • 每个结点的数据介于-1000和1000之间。

解答与实现

思路:

  1. 使用广度优先搜索(BFS)算法遍历二叉树。
  2. 在BFS的过程中,记录每一层元素的和。
  3. 在遍历结束后,找出最大元素和所在的层。

代码:

using System.Collections.Generic;

namespace LeetCode
{
    public class Solution
    {
        public int MaxLevelSum(TreeNode root)
        {
            int maxLevel = 1;
            int maxSum = int.MinValue;
            Queue<TreeNode> queue = new Queue<TreeNode>();
            queue.Enqueue(root);

            while (queue.Count > 0)
            {
                int levelSum = 0;
                int levelSize = queue.Count;

                for (int i = 0; i < levelSize; i++)
                {
                    TreeNode node = queue.Dequeue();
                    levelSum += node.val;

                    if (node.left != null)
                    {
                        queue.Enqueue(node.left);
                    }
                    if (node.right != null)
                    {
                        queue.Enqueue(node.right);
                    }
                }

                if (levelSum > maxSum)
                {
                    maxSum = levelSum;
                    maxLevel = level;
                }
            }

            return maxLevel;
        }
    }

    public class TreeNode
    {
        public int val;
        public TreeNode left;
        public TreeNode right;

        public TreeNode(int val = 0, TreeNode left = null, TreeNode right = null)
        {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }
}

复杂度分析

时间复杂度: O(N),其中N是二叉树的结点数。BFS算法的复杂度为O(N),因为我们需要遍历二叉树中的所有结点。

空间复杂度: O(N),因为我们需要使用队列来存储二叉树中的结点。


进阶技巧

优化代码性能:
可以使用以下技巧来优化代码性能:

  1. 在BFS的过程中,如果遇到某个层的元素和大于maxSum,则可以直接停止遍历该层后面的结点。
  2. 可以使用双端队列(deque)来存储二叉树中的结点,这样可以减少队列的操作次数。
  3. 可以使用非递归的BFS算法来遍历二叉树,这样可以减少栈空间的使用。

简化代码:
可以使用以下技巧来简化代码:

  1. 将BFS算法的代码封装成一个单独的函数。
  2. 使用foreach循环来遍历队列中的结点。
  3. 使用匿名函数来定义BFS算法的委托。

希望本文对您有所帮助。如果您有任何问题,请随时提出。