Giả sử chúng ta có một cây nhị phân và một giá trị khác k, chúng ta phải tìm số nút duy nhất đến các đường dẫn con con ở đó mà tổng bằng k.
Vì vậy, nếu đầu vào giống như
và k =5, thì đầu ra sẽ là 2, vì các đường dẫn là [2, 3] và [1, 4]
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- count:=một bản đồ ban đầu giữ giá trị 1 cho khóa 0
- ans:=0, tiền tố:=0
- Định nghĩa một hàm dfs (). Điều này sẽ lấy nút
- nếu nút không rỗng, thì
- prefix:=tiền tố + giá trị của nút
- ans:=ans + (count [prefix - target], nếu không có thì nó sẽ là 0)
- count [prefix]:=count [prefix] + 1
- dfs (bên trái của nút)
- dfs (bên phải của nút)
- count [prefix]:=count [prefix] - 1
- prefix:=prefix - giá trị của nút
- Từ phương pháp chính, hãy thực hiện như sau
- dfs (gốc)
- trả lại ans
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
from collection import Counterclass TreeNode:def __init __ (self, data, left =None, right =None):self.val =data self.left =left self.right =rightclass Giải pháp:def giải (self, root, target ):count =Counter ([0]) ans =prefix =0 def dfs (node):nonlocal ans, prefix if node:prefix + =node.val ans + =count [prefix - target] count [prefix] + =1 dfs (node.left) dfs (node.right) count [prefix] - =1 prefix - =node.val dfs (root) return ans ob =Solution () root =TreeNode (3) root.left =TreeNode (2) root.right =TreeNode (4) root.right.left =TreeNode (1) root.right.left.right =TreeNode (2) k =5print (ob.solve (root, k))
Đầu vào
root =TreeNode (3) root.left =TreeNode (2) root.right =TreeNode (4) root.right.left =TreeNode (1) root.right.left.right =TreeNode (2) 5Đầu ra
2