題目要求我們找到二元樹的最小深度。
而最小深度的定義是:
從根節點到最近葉子節點的最短路徑上的節點數目。
葉子節點是沒有子節點的節點,也就是說,它沒有左子節點和右子節點。
程式碼:
class Solution:
def minDepth(self, root):
# 如果根節點是空的,返回 0
if not root:
return 0
# 如果是葉子節點,返回 1
if not root.left and not root.right:
return 1
# 如果左子樹或右子樹是空的,取非空的子樹的最小深度
if not root.left:
return self.minDepth(root.right) + 1
if not root.right:
return self.minDepth(root.left) + 1
# 如果左右子樹都存在,取左右子樹中較小的深度
return min(self.minDepth(root.left), self.minDepth(root.right)) + 1
題目要求我們在一棵**二元搜尋樹(BST, Binary Search Tree)**中找到第 k
小的節點值。
二元搜尋樹的特點:
左子樹的所有節點值都小於根節點的值。
右子樹的所有節點值都大於根節點的值。
中序遍歷(In-order traversal)可以將二元搜尋樹的節點按升序排序。
因為BST使用中序遍歷會按照從小到大的順序訪問節點,所以找出第 k
小的數值,就會是第 k
個數值。
程式碼:
class Solution:
def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
self.counter = 0
def dfs(node):
if not node:
return None
# 遍歷左子樹,檢查是否找到了結果
left = dfs(node.left)
if left is not None:
return left
# 計數器加1,表示已經遍歷了一個節點
self.counter += 1
# 當計數器等於 k 時,返回當前節點值
if self.counter == k:
return node.val
# 遍歷右子樹,檢查是否找到了結果
return dfs(node.right)
# 從根節點開始進行 DFS 遍歷,並返回結果
return dfs(root)
與普通的中序遍歷的最大區別