> 文章列表 > 【算法题】2583. 二叉树中的第 K 大层和

【算法题】2583. 二叉树中的第 K 大层和

【算法题】2583. 二叉树中的第 K 大层和

题目:

给你一棵二叉树的根节点 root 和一个正整数 k 。

树中的 层和 是指 同一层 上节点值的总和。

返回树中第 k 大的层和(不一定不同)。如果树少于 k 层,则返回 -1 。

注意,如果两个节点与根节点的距离相同,则认为它们在同一层。

示例1:
【算法题】2583. 二叉树中的第 K 大层和

输入:root = [5,8,9,2,1,3,7,4,6], k = 2
输出:13
解释:树中每一层的层和分别是:

  • Level 1: 5
  • Level 2: 8 + 9 = 17
  • Level 3: 2 + 1 + 3 + 7 = 13
  • Level 4: 4 + 6 = 10
    第 2 大的层和等于 13 。

示例 2:
【算法题】2583. 二叉树中的第 K 大层和
输入:root = [1,2,null,3], k = 1
输出:3
解释:最大的层和是 3 。

提示:

树中的节点数为 n
2 <= n <= 10^5
1 <= Node.val <= 10^6
1 <= k <= n

java代码 :

/* Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/class Solution {public long kthLargestLevelSum(TreeNode root, int k) {if(root == null) return -1;//根节点为空,直接返回-1。ArrayList<Long> arr = new ArrayList<>();//暂存层和,也即每层中节点value的累加值。Deque<TreeNode> que = new ArrayDeque<>();//队列。que.addFirst(root);//先加入根节点。while(que.isEmpty() == false) {int num = que.size();//当前层中的节点数。long sum = 0;//累加值。for(int i = 0; i  <num; i++) {//每个节点分别出队累加并在队列中加入新节点。TreeNode temp = que.pollLast();sum += temp.val;if(temp.left != null) que.addFirst(temp.left);//注意非空时才能累加。if(temp.right != null) que.addFirst(temp.right);}arr.add(sum);//当前层和暂存。}arr.sort(Comparator.naturalOrder());//排序。if(arr.size() >= k) return arr.get(arr.size() - k);//若层数比k大,输出第k大。else return -1;}
}