Câu trả lời của tôi là O(n^2)
, nhưng tôi tin rằng câu trả lời là chính xác và mất hơi cách tiếp cận khác nhau và có vẻ dễ triển khai hơn.
Giả sử giá trị được lưu trữ tại nút i
được biểu thị bằng VALUE[i]
. Ý tưởng của tôi là lưu trữ tại mỗi nút tổng của các giá trị trên đường dẫn từ root
đến nút đó. Vì vậy, đối với mỗi nút i
, SUM[i]
là tổng của đường dẫn từ root
đến nút i
.
Sau đó cho mỗi cặp nút (i,j)
, hãy tìm tổ tiên chung của chúng k
. Nếu SUM(i)+SUM(j)-SUM(k) = TARGET_SUM
, bạn đã tìm thấy câu trả lời.
Đây là O(n^2)
vì chúng tôi đang lặp qua tất cả các cặp nút. Mặc dù, tôi ước tôi có thể tìm ra cách tốt hơn là chỉ chọn tất cả các cặp.
Chúng tôi có thể tối ưu hóa nó một chút bằng cách loại bỏ các subtrees trong đó value
của nút được bắt nguồn từ cây con lớn hơn TARGET_SUM
. Bất kỳ tối ưu hóa hơn nữa được hoan nghênh :)
psuedocode:
# Skipping code for storing sum of values from root to each node i in SUM[i]
for i in nodes:
for j in nodes:
k = common_ancestor(i,j)
if (SUM[i] + SUM[j] - SUM[k] == TARGET_SUM):
print_path(i,k,j)
Chức năng common_ancestor
là một vấn đề khá tiêu chuẩn cho một cây tìm kiếm nhị phân. Psuedocode (từ bộ nhớ, hy vọng không có lỗi!):
sub common_ancestor (i, j):
parent_i = parent(i)
# Go up the parent chain until parent's value is out of the range.
# That's a red flag.
while(VAL[i] <= VAL[parent_i] <= VAL[j]) :
last_parent = parent_i
parent_i = parent(i)
if (parent_i == NULL): # root node
break
return last_parent
@ gốc là 2, cây con trái là 1 và cây con phải là 3 trong ví dụ được đăng – TimeToCodeTheRoad
Tôi muốn sử dụng biểu đồ hai chiều hơn (với các kết nối nút hạn chế) cho mục đích đó. Cây Bin (ít nhất là đối với tôi) ngụ ý một hướng duy nhất cố định. – fjdumont
Điều này giúp ích như thế nào? – marcog