मेरा उत्तर O(n^2)
है, लेकिन मुझे लगता है कि यह सही है, और थोड़ा अलग दृष्टिकोण लेता है और इसे लागू करने में आसान लग रहा है।
मान लें कि नोड i
पर संग्रहीत मान VALUE[i]
द्वारा दर्शाया गया है। मेरा विचार है कि प्रत्येक नोड को उस नोड पर root
से पथ पर मानों के योग को स्टोर करना है। इसलिए प्रत्येक नोड i
, SUM[i]
root
से i
नोड के पथ का योग है।
फिर प्रत्येक नोड जोड़ी (i,j)
के लिए, उनके सामान्य पूर्वजों k
खोजें। यदि SUM(i)+SUM(j)-SUM(k) = TARGET_SUM
, आपको एक उत्तर मिला है।
यह O(n^2)
है क्योंकि हम सभी नोड जोड़े पर लूपिंग कर रहे हैं। हालांकि, मेरी इच्छा है कि मैं सिर्फ सभी जोड़ों को चुनने से बेहतर तरीके से पता लगा सकूं।
हम सबट्री को छोड़कर इसे थोड़ा सा अनुकूलित कर सकते हैं जहां value
उपट्री में रूट नोड के TARGET_SUM
से अधिक है। किसी भी आगे अनुकूलन स्वागत है :)
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)
समारोह common_ancestor
एक द्विआधारी खोज वृक्ष के लिए एक सुंदर मानक समस्या है। Psuedocode (स्मृति से, उम्मीद है कि कोई त्रुटि नहीं है!):
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
@ रूट 2 है, बायां सबट्री 1 है, और – TimeToCodeTheRoad
पोस्ट किए गए उदाहरण में दाएं उपट्री 3 है, मैं उस उद्देश्य के लिए एक बिडरेक्शनल ग्राफ (सीमित नोड कनेक्शन के साथ) का उपयोग करना चाहता हूं। बिन पेड़ (कम से कम मेरे लिए) एक निश्चित, एकल दिशा का मतलब है। – fjdumont
यह कैसे मदद करता है? – marcog