मान लीजिए हमें एक बाइनरी ट्री दिया गया है और हमें बाइनरी ट्री में दो नोड्स के बीच की दूरी ढूंढनी है। हम दो नोड्स के बीच के एज को ग्राफ की तरह ढूंढते हैं और उनके बीच एज की संख्या या दूरी वापस करते हैं। ट्री के नोड की संरचना नीचे दी गई है:
data:right: left:
उदाहरण के लिए, यदि इनपुट है:

और जिन नोड्स के बीच हमें दूरी ढूंढनी है वे 2 और 8 हैं; तो आउटपुट 4 होगा।
दो नोड्स 2 और 8 के बीच के एज हैं: (2, 3), (3, 5), (5, 7), और (7, 8)। उनके बीच पथ में 4 एज हैं, इसलिए दूरी 4 है।
हल करने के चरण
findLca()फ़ंक्शन परिभाषित करें। यहroot, p, qलेगा:- यदि
root is None, तोNoneवापस करें। - यदि
rootका डेटा(p,q)में से कोई है, तोrootवापस करें। left := findLca(root.left, p, q)right := findLca(root.right, p, q)- यदि
leftऔरrightदोनों नॉन-नल हैं, तोrootवापस करें। left or rightवापस करें।
- यदि
findDist()फ़ंक्शन परिभाषित करें। यहroot, dataलेगा:queue :=नया deque(root, 0)जोड़ी कोqueueके अंत में डालेंqueueखाली न होने तक व्हाइल लूप चलाएं:current := queueमें सबसे बाईं जोड़ी का पहला मानdist := queueमें सबसे बाईं जोड़ी का दूसरा मान- यदि
currentका डेटाdataके बराबर है, तोdistवापस करें। - यदि
current.leftनॉन-नल है, तो(current.left, dist+1)जोड़ी कोqueueमें जोड़ें। - यदि
current.rightनॉन-नल है, तो(current.right, dist+1)जोड़ी कोqueueमें जोड़ें।
node := findLca(root, p, q)findDist(node, p) + findDist(node, q)वापस करें।
उदाहरण
बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:
import collections
class TreeNode:
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
def insert(temp, data):
que = []
que.append(temp)
while len(que):
temp = que[0]
que.pop(0)
if not temp.left:
if data is not None:
temp.left = TreeNode(data)
else:
temp.left = TreeNode(0)
break
else:
que.append(temp.left)
if not temp.right:
if data is not None:
temp.right = TreeNode(data)
else:
temp.right = TreeNode(0)
break
else:
que.append(temp.right)
def make_tree(elements):
Tree = TreeNode(elements[0])
for element in elements[1:]:
insert(Tree, element)
return Tree
def search_node(root, element):
if root is None:
return None
if root.data == element:
return root
res1 = search_node(root.left, element)
if res1:
return res1
res2 = search_node(root.right, element)
return res2
def findLca(root, p, q):
if root is None:
return None
if root.data in (p, q):
return root
left = findLca(root.left, p, q)
right = findLca(root.right, p, q)
if left and right:
return root
return left or right
def findDist(root, data):
queue = collections.deque()
queue.append((root, 0))
while queue:
current, dist = queue.popleft()
if current.data == data:
return dist
if current.left:
queue.append((current.left, dist + 1))
if current.right:
queue.append((current.right, dist + 1))
def solve(root, p, q):
node = findLca(root, p, q)
return findDist(node, p) + findDist(node, q)
root = make_tree([5, 3, 7, 2, 4, 6, 8])
print(solve(root, 2, 8))
इनपुट
root = make_tree([5, 3, 7, 2, 4, 6, 8]) print(solve(root, 2, 8))
आउटपुट
4