TreeNode क्लास और स्तर-क्रम BFS
ऐरे से द्विआधारी वृक्ष बनाइए, स्तर-दर-स्तर प्रिंट करने के लिए deque के साथ BFS लागू कीजिए और BFS से अधिकतम गहराई निकालिए।
TreeNode क्लास और स्तर-क्रम BFS, CoddyKit पर DSA Interview Prep का एक निःशुल्क पाठ है। यह 4 में से 1वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह DSA Interview Prep सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। DSA Interview Prep पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
TreeNode वर्ग की बुनियाद
द्विआधारी वृक्ष एक पदानुक्रमित डेटा संरचना है, जिसमें हर नोड की अधिकतम दो संततियाँ होती हैं, जिन्हें बायाँ और दायाँ कहा जाता है। Python में हम एक सरल वर्ग से नोड का मॉडल बनाते हैं: class TreeNode: def __init__(self, val=0, left=None, right=None)। साक्षात्कारों में वृक्ष से जुड़ी हर समस्या इसी परिभाषा से शुरू होती है — लगभग हर LeetCode वृक्ष समस्या के प्रारंभिक ढाँचे में आप इसे देखेंगे।
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
# Build a small tree manually:
# 1
# / \
# 2 3
# / \
# 4 5
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
print(root.val, root.left.val, root.right.val)सरणियों से वृक्ष बनाना
साक्षात्कार की समस्याएँ अक्सर आपको स्तर-क्रम वाली सरणी के रूप में दिया गया वृक्ष देती हैं, जहाँ None अनुपस्थित नोड को दर्शाता है। सूचकांक i दिए जाने पर, बायीं संतति 2i+1 पर और दायीं संतति 2i+2 पर होती है। इस सरणी को जुड़े हुए TreeNodes में पुनर्निर्मित करने वाला सहायक फ़ंक्शन लिखना एक उपयोगी साधन है, जो अभ्यास सत्रों में समय बचाता है।
from collections import deque
def build_tree(arr):
if not arr or arr[0] is None:
return None
root = TreeNode(arr[0])
q = deque([root])
i = 1
while q and i < len(arr):
node = q.popleft()
if i < len(arr) and arr[i] is not None:
node.left = TreeNode(arr[i])
q.append(node.left)
i += 1
if i < len(arr) and arr[i] is not None:
node.right = TreeNode(arr[i])
q.append(node.right)
i += 1
return root
root = build_tree([1, 2, 3, 4, 5, None, 6])
print(root.val, root.left.val, root.right.val)BFS क्या है और कतार क्यों?
चौड़ाई-प्रथम खोज (BFS) गहराई d के सभी नोड पर गहराई d+1 के किसी भी नोड पर पहुँचने से पहले पहुँचती है। स्तर-दर-स्तर होने वाला यह भ्रमण ठीक वही है जो एक कतार (FIFO) हमें देती है: हम मूल नोड को कतार में डालते हैं, फिर एक-एक करके नोड संसाधित करते हैं और आगे बढ़ते हुए हर नोड की संततियों को कतार में डालते हैं। Python का collections.deque O(1) appendleft और popleft देता है, इसलिए साधारण सूची की तुलना में यही सही विकल्प है।
from collections import deque
def bfs_print(root):
if not root:
return
q = deque([root])
while q:
node = q.popleft()
print(node.val, end=' ')
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
bfs_print(root) # 1 2 3 4स्तर-क्रम BFS: स्तर के अनुसार समूह बनाना
BFS का मानक रूपांतर हर पुनरावृत्ति की शुरुआत में कतार का आकार दर्ज करके नोड को स्तरों में बाँटता है। ठीक उतने ही नोड संसाधित करें, उनके मान एकत्र करें और फिर अगले स्तर पर जाएँ। इससे सूचियों की एक सूची बनती है — द्विआधारी वृक्ष का स्तर-क्रम भ्रमण, ज़िगज़ैग भ्रमण और दाएँ ओर का दृश्य जैसी समस्याओं के लिए यह साक्षात्कारों में बहुत सामान्य परिणाम प्रारूप है।
from collections import deque
def level_order(root):
if not root:
return []
result = []
q = deque([root])
while q:
level_size = len(q)
level = []
for _ in range(level_size):
node = q.popleft()
level.append(node.val)
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
result.append(level)
return result
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
print(level_order(root)) # [[1], [2, 3], [4]]BFS द्वारा अधिकतम गहराई
द्विआधारी वृक्ष की अधिकतम गहराई उसके BFS भ्रमण में स्तरों की संख्या के बराबर होती है। आप जितनी बार एक स्तर का लूप पूरा करते हैं, बस उतनी बार गिनें। इससे O(n) समय और O(w) स्थान वाला समाधान मिलता है, जहाँ w वृक्ष की अधिकतम चौड़ाई है। संतुलित वृक्ष के लिए w, O(n/2) होता है, इसलिए सबसे खराब स्थिति में स्थान O(n) होता है।
from collections import deque
def max_depth_bfs(root):
if not root:
return 0
depth = 0
q = deque([root])
while q:
depth += 1
for _ in range(len(q)):
node = q.popleft()
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
return depth
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
print(max_depth_bfs(root)) # 3द्विआधारी वृक्ष का दाएँ ओर का दृश्य
दाएँ ओर का दृश्य दाईं ओर से वृक्ष को देखने पर दिखाई देने वाले अंतिम नोड को लौटाता है — अर्थात BFS भ्रमण में हर स्तर का अंतिम तत्व। यह स्तर-क्रम BFS का सीधा उपयोग है: हर स्तर के लूप में अंतिम नोड एकत्र करें। समय जटिलता O(n) और कतार के लिए स्थान जटिलता O(w) है।
from collections import deque
def right_side_view(root):
if not root:
return []
result = []
q = deque([root])
while q:
level_size = len(q)
for i in range(level_size):
node = q.popleft()
if i == level_size - 1:
result.append(node.val)
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
return result
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.right = TreeNode(5)
print(right_side_view(root)) # [1, 3, 5]जिगजैग स्तर-क्रम भ्रमण
जिगजैग भ्रमण में विषम स्तरों को बाएँ से दाएँ और सम स्तरों को दाएँ से बाएँ एकत्र किया जाता है। सबसे साफ़ कार्यान्वयन BFS की कतार को अपरिवर्तित रखता है और परिणाम में जोड़ने से पहले केवल बारी-बारी से स्तर-सूचियों को उलटता है। हर स्तर पर दिशा बदलने के लिए एक बूलियन संकेतक रखें। इससे आंतरिक लूप में दो-मुखी कतार की जटिलता से बचा जा सकता है।
from collections import deque
def zigzag_level_order(root):
if not root:
return []
result = []
q = deque([root])
left_to_right = True
while q:
level = []
for _ in range(len(q)):
node = q.popleft()
level.append(node.val)
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
result.append(level if left_to_right else level[::-1])
left_to_right = not left_to_right
return result
root = TreeNode(3)
root.left = TreeNode(9)
root.right = TreeNode(20)
root.right.left = TreeNode(15)
root.right.right = TreeNode(7)
print(zigzag_level_order(root))BFS की स्थान-जटिलता का विश्लेषण
BFS में O(w) स्थान लगता है, जहाँ w ट्री की अधिकतम चौड़ाई है। n नोड वाले पूर्ण बाइनरी ट्री में अंतिम स्तर पर (n+1)/2 नोड होते हैं—इसलिए BFS एक साथ कतार में अधिकतम n/2 नोड रख सकता है। इस कारण चौड़े संतुलित ट्री के लिए स्थान की दृष्टि से BFS, DFS (O(h)) से अधिक खर्चीला है, लेकिन गहरे एकतरफ़ा ट्री के लिए बेहतर है, जहाँ DFS के कॉल-स्टैक की गहराई n के बराबर होती है।
# Space comparison: BFS vs DFS on a complete binary tree
# n=15 nodes, height=4
# BFS max queue size = 8 (last level)
# DFS max call stack = 4 (height)
# For a skewed tree (like a linked list):
# n=1000 nodes
# BFS max queue size = 1 (always 1 node per level)
# DFS max call stack = 1000 (recursion depth -> stack overflow!)
from collections import deque
def skewed_tree(n):
root = TreeNode(1)
cur = root
for i in range(2, n+1):
cur.right = TreeNode(i)
cur = cur.right
return root
root = skewed_tree(10)
print('BFS on skewed tree is safe')बाइनरी ट्री के स्तरों का औसत
प्रत्येक स्तर पर औसत मान निकालना BFS का एक और सीधा अनुप्रयोग है। किसी स्तर के सभी मानों का योग करें, उसे नोडों की संख्या से विभाजित करें और परिणाम-सूची में जोड़ें। यह समस्या जाँचती है कि आप स्तर वाले लूप के भीतर अंकगणित कर सकते हैं या नहीं। Python 3 में हमेशा float विभाजन का उपयोग करें (/ ऑपरेटर), और शुरुआत में ही रिक्त ट्री की विशेष स्थिति संभाल लें।
from collections import deque
def average_of_levels(root):
if not root:
return []
result = []
q = deque([root])
while q:
size = len(q)
total = 0
for _ in range(size):
node = q.popleft()
total += node.val
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
result.append(total / size)
return result
root = TreeNode(3)
root.left = TreeNode(9)
root.right = TreeNode(20)
root.right.left = TreeNode(15)
root.right.right = TreeNode(7)
print(average_of_levels(root)) # [3.0, 14.5, 11.0]BFS द्वारा न्यूनतम गहराई
न्यूनतम गहराई मूल नोड से निकटतम पत्ती नोड तक की दूरी है (ऐसा नोड जिसकी कोई संतति न हो)। BFS इसे सर्वोत्तम ढंग से खोजता है: स्तर-क्रम भ्रमण के दौरान मिलने वाला पहला पत्ती नोड निश्चित रूप से न्यूनतम गहराई पर होता है। पत्ती मिलते ही वर्तमान गहराई लौटा दें। इसकी सबसे खराब स्थिति में समय-जटिलता O(n) है, लेकिन संतुलित ट्री के लिए यह अक्सर बहुत पहले समाप्त हो जाता है।
from collections import deque
def min_depth(root):
if not root:
return 0
q = deque([(root, 1)])
while q:
node, depth = q.popleft()
# A leaf has no children
if not node.left and not node.right:
return depth
if node.left:
q.append((node.left, depth + 1))
if node.right:
q.append((node.right, depth + 1))
return 0
root = TreeNode(2)
root.left = TreeNode(3)
root.left.left = TreeNode(4)
root.right = TreeNode(5) # leaf at depth 2
print(min_depth(root)) # 2स्तर-क्रम के सहोदर नोड जोड़ना
अगले-दाएँ सूचकों को भरने वाली समस्या में आपसे प्रत्येक नोड को उसी स्तर पर उसके दाएँ पड़ोसी से जोड़ने के लिए कहा जाता है। BFS के साथ यह सीधा है: प्रत्येक स्तर वाले लूप के भीतर, अंतिम नोड को छोड़कर सभी नोडों के लिए node.next = q[0] निर्धारित करें। यह ऐसा उत्कृष्ट उदाहरण है जहाँ BFS समाधान को स्पष्ट कर देता है, जबकि DFS में उपट्री के बीच सूचकों का सावधानीपूर्वक लेखा रखना पड़ता है।
from collections import deque
class Node:
def __init__(self, val=0, left=None, right=None, next=None):
self.val = val
self.left = left
self.right = right
self.next = next
def connect(root):
if not root:
return root
q = deque([root])
while q:
size = len(q)
for i in range(size):
node = q.popleft()
if i < size - 1:
node.next = q[0]
if node.left:
q.append(node.left)
if node.right:
q.append(node.right)
return root
print('BFS connect: O(n) time, O(w) space')त्वरित जाँच
इस पाठ में सिखाई गई डेटा संरचनाओं और एल्गोरिदम—कोडिंग साक्षात्कार की तैयारी—से जुड़ी अवधारणाओं की अपनी समझ जाँचें।
पाठ का पुनरावलोकन
इस पाठ में आपने सीखा: TreeNode क्लास की परिभाषा और सरणियों से ट्री बनाना, नोडों को समूहित करने के लिए स्तर-आकार युक्ति के साथ द्विमुखी कतार का उपयोग करके स्तर-क्रम BFS, तथा अधिकतम गहराई, न्यूनतम गहराई, दाएँ-पक्ष का दृश्य, जिगजैग भ्रमण और स्तरों के औसत जैसे अनुप्रयोग। आगे हम पुनरावर्ती DFS भ्रमण-क्रमों का अध्ययन करेंगे।
एआई शिक्षक के साथ Python सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 30
- पाठ
- 120
अक्सर पूछे जाने वाले प्रश्न
क्या “TreeNode क्लास और स्तर-क्रम BFS” पाठ निःशुल्क है?
हाँ — DSA Interview Prep अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “TreeNode क्लास और स्तर-क्रम BFS” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। DSA Interview Prep पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“TreeNode क्लास और स्तर-क्रम BFS” में मैं क्या सीखूँगा?
ऐरे से द्विआधारी वृक्ष बनाइए, स्तर-दर-स्तर प्रिंट करने के लिए deque के साथ BFS लागू कीजिए और BFS से अधिकतम गहराई निकालिए। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ DSA Interview Prep का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या DSA Interview Prep शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर DSA Interview Prep शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 1वाँ पाठ है।
“TreeNode क्लास और स्तर-क्रम BFS” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस DSA Interview Prep पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर DSA Interview Prep पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।
इस पाठ्यक्रम के सभी पाठ
- TreeNode क्लास और स्तर-क्रम BFS
- In-Order, Pre-Order, Post-Order DFS
- व्यास, ऊँचाई और संतुलित वृक्ष
- पथ योग और न्यूनतम साझा पूर्वज