Cho cây nhị phân giá trị duy nhất và số k, đếm số đường đi độ dài k (đi từ cha đến con hoặc con đến cha). Hai đường đi khác nhau nếu có nút khác nhau.
Ví dụ
Cây đầu vào: (hình ảnh), k = 3.
Đầu ra: 4 (đường đi: [12,8,3], [12,8,10], [8,12,15], [3,8,10]).
Thuật toán
- DFS trả về mảng
reskích thướcK,res[i]= số đường đi từ nút hiện tại xuống con cháu ở độ sâui. - Kết hợp kết quả từ trái và phải:
ans += left[i] * right[K-1-i]. - Cập nhật
rescho nút cha. - Trả về
ans.
Mã nguồn Python
class TreeNode:
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
class Solution:
def solve(self, root, K):
def dfs(node):
if not node:
return [1] + [0] * (K-1)
left = dfs(node.left)
right = dfs(node.right)
for i in range(K):
self.ans += left[i] * right[K - 1 - i]
res = [0] * K
res[0] = res[1] = 1
for i in range(1, K - 1):
res[i + 1] += left[i]
res[i + 1] += right[i]
return res
self.ans = 0
dfs(root)
return self.ans
ob = Solution()
root = TreeNode(12)
root.left = TreeNode(8)
root.right = TreeNode(15)
root.left.left = TreeNode(3)
root.left.right = TreeNode(10)
print(ob.solve(root, 3))
Đầu vào / Đầu ra
Input: root = TreeNode(12) ..., 3
Output: 4