Leetcode日記 2583. 二叉樹中的第 K 大層和
- 題目:
- 解題思路:
- 代碼實現
- 制作不易,感謝三連,謝謝啦
題目:
給你一棵二叉樹的根節點 root 和一個正整數 k 。
樹中的 層和 是指 同一層 上節點值的總和。
返回樹中第 k 大的層和(不一定不同)。如果樹少于 k 層,則返回 -1 。
注意,如果兩個節點與根節點的距離相同,則認為它們在同一層。
示例 1:
輸入: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:
輸入:root = [1,2,null,3], k = 1
輸出:3
解釋:最大的層和是 3 。
提示:
樹中的節點數為 n
2 <= n <= 105
1 <= Node.val <= 106
1 <= k <= n
解題思路:
- 首先,我們應該要看他要的結果是什么,是第k大的層和,那么我們就應該把二叉樹整個層次遍歷
- 其次,我們把遍歷后的結果再遍歷一遍,求出層和,
- 最后,我們直接使用sort函數進行排序,再返回第k大的值
- 改進:求層和,可以放在遍歷二叉樹的時候進行,這樣可以減少整體的時間按復雜度。并且在遍歷二叉樹之后判斷一次,層高和k的大小,如果層高小于k就可以直接拋出-1結束,畢竟sort的時間復雜度也是O(nlgn),算是這里面時間復雜度最大的了,不過這道題對于時間復雜度的考量并沒有很多
代碼實現
class TreeNode(object):def __init__(self, val=0, left=None, right=None):self.val = valself.left = leftself.right = right
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
root.right.left = TreeNode(6)
root.right.right = TreeNode(7)
from typing import Optional
class Solution:def kthLargestLevelSum(self, root: Optional[TreeNode], k: int) -> int:if root is None: return [] queue = [root]result = []while queue :result.append([])temp = []for i in range(len(queue)) :if queue[i].left :temp.append(queue[i].left)if queue[i].right :temp.append(queue[i].right)result[-1].append(queue[i].val)queue = tempif len(result) < k :return -1for i in range(len(result)) :result[i] = sum(result[i])result.sort(reverse=True)return result[k-1]
a = Solution().kthLargestLevelSum(root,2)
print(a)