LeetCode 3319. 第 K 大的完美二叉子树的大小
给你一棵 二叉树 的根节点 root 和一个整数k。
返回第 k 大的 完美二叉子树的大小,如果不存在则返回 -1。
完美二叉树 是指所有叶子节点都在同一层级的树,且每个父节点恰有两个子节点。
子树 是指树中的某一个节点及其所有后代形成的树。
示例 1:
输入: root = [5,3,6,5,2,5,7,1,8,null,null,6,8], k = 2
输出: 3
解释:
完美二叉子树的根节点在图中以黑色突出显示。它们的大小按降序排列为 [3, 3, 1, 1, 1, 1, 1, 1]。
第 2 大的完美二叉子树的大小是 3。
示例 2:
输入: root = [1,2,3,4,5,6,7], k = 1
输出: 7
解释:
完美二叉子树的大小按降序排列为 [7, 3, 3, 1, 1, 1, 1]。最大的完美二叉子树的大小是 7。
示例 3:
输入: root = [1,2,3,null,4], k = 3
输出: -1
解释:
完美二叉子树的大小按降序排列为 [1, 1]。完美二叉子树的数量少于 3。
提示:
树中的节点数目在 [1, 2000] 范围内。
1 <= Node.val <= 2000
1 <= k <= 1024
DFS
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def kthLargestPerfectSubtree(self, root: Optional[TreeNode], k: int) -> int:
details = [0] * 2001
def build_details(idx, node):
if not node:
# judge, count, height
return True, 0, 0
left_judge = build_details(idx * 2, node.left)
right_judge = build_details(idx * 2 + 1, node.right)
judge, count = False, 0
height = 1 + max(left_judge[2], right_judge[2])
if left_judge[0] and right_judge[0] and left_judge[2] == right_judge[2]:
count = 1 + left_judge[1] + right_judge[1]
judge = True
details[idx] = count
return judge, count, height
build_details(1, root)
details.sort(reverse=True)
_res = details[k - 1]
return _res if _res else -1