पाठ · #5 / 11

बाइनरी पेड़ (Binary Trees)

एक नोड, दो संतान — हर रिकर्सिव डेटा स्ट्रक्चर

Binary tree · traversal orders

pick a traversal → · preorder / inorder / postorder / level
init

खुद आज़माएँ: कुछ मान insert कीजिए। फिर हर traversal आज़माइए — preorder, inorder, postorder, level — और देखिए कि पेड़ के नीचे विज़िट का क्रम कैसे जगमगाता है।

यह क्यों मायने रखता है

पदानुक्रमिक (hierarchical) डेटा के लिए पेड़ स्वाभाविक संरचना हैं: फ़ाइल सिस्टम, HTML दस्तावेज़, संगठन-चार्ट, निर्णय-वृक्ष (decision trees)। बाइनरी पेड़ BST, हीप और अभिव्यक्ति पार्सिंग की बुनियाद हैं।

मूल विचार

एक वंश-वृक्ष (family tree) की कल्पना कीजिए, पर जहाँ हर व्यक्ति की अधिक से अधिक दो संतान हों (बाएँ और दाएँ)। एक अकेले मूल पूर्वज (root) से शुरू कीजिए।

यही एक बाइनरी पेड़ है। हर नोड की अधिक से अधिक दो संतान होती हैं।

पेड़ डेटा को व्यवस्थित करने के नए तरीक़े खोलते हैं:

Traversal नोडों को अलग-अलग क्रम में देखते हैं:

मुख्य बातें

और गहराई में

एक पूर्ण (complete) बाइनरी पेड़ अगला स्तर शुरू करने से पहले हर स्तर को भर देता है (आख़िरी स्तर शायद अपवाद हो)। एक भरा हुआ (full) बाइनरी पेड़ वह है जिसमें हर नोड के 0 या 2 बच्चे हों। एक परिपूर्ण (perfect) बाइनरी पेड़ complete और full दोनों होता है। ये भेद हीप इम्प्लीमेंटेशन (जिसके लिए complete ज़रूरी है) और पेड़ संतुलन के लिए मायने रखते हैं।

"स्तर k पर अधिकतम नोड = 2ᵏ" वाला सूत्र आगमन (induction) से निकल आता है: स्तर 0 पर एक नोड होता है (root); हर स्तर पर पिछले से अधिक से अधिक दुगुने। स्तर 0 से ऊँचाई h तक गुणोत्तर श्रेणी जोड़ने पर अधिकतम 2^(h+1) − 1 नोड मिलते हैं। उलट दीजिए: n नोडों का एक संतुलित पेड़ ⌊log₂ n⌋ ऊँचाई का होता है।

असल दुनिया में

गणितीय ब्यौरा

Tree properties
max nodes at level k 2ᵏ
max nodes in tree, height h 2ʰ⁺¹ − 1
min height, n nodes ⌊log₂ n⌋
max height (degenerate) n − 1
Traversal time
O(n) — हर नोड ठीक एक बार देखा जाता है
Space
recursive traversal O(h) कॉल स्टैक पर
iterative (BFS) O(w) जहाँ w सबसे चौड़ा स्तर है

क्रियान्वयन (Implementation)

बाइनरी पेड़ नोड

struct TreeNode<T> {
    data: T,
    left: Option<Box<TreeNode<T>>>,
    right: Option<Box<TreeNode<T>>>,
}

// In-order traversal (recursive)
fn inorder(node: Option<&Box<TreeNode<T>>>) {
    if let Some(n) = node {
        inorder(n.left.as_ref());
        process(n.data);
        inorder(n.right.as_ref());
    }
}

Traversal क्रम

अभ्यास

तीन सवाल, हर एक अलग रिकर्शन आकार सिखाता है:

सभी अभ्यास सवाल देखें