মূল কনটেন্টে যান
🧩
লোকাল DSA
প্যাটার্নটপিক 5 · Trees

5.2 Tree Construction

চিনবেন কীভাবে
"construct from preorder/inorder", "rebuild tree" — একটা traversal root চেনায়, আরেকটা left/right ভাগ করে
Demo · approach · কোড — আগে নিজে চেষ্টা, আটকালে খুলুন

Demo: Construct Binary Tree from Preorder and InorderLC 105 (Medium — Amazon/Google High)

Statement (Demo): integer array preorderinorder দেওয়া (একটা binary tree-এর preorder ও inorder traversal) — সেই binary tree টি reconstruct করে root return করুন। সব node-এর মান unique। উদাহরণ: preorder=[3,9,20,15,7], inorder=[9,3,15,20,7] → tree with root 3 | ⚡ n ≤ 3000

Approach: preorder-এর প্রথম এলিমেন্ট = root। inorder-এ সেই root-এর position বাম/ডান subtree ভাগ করে দেয়। inorder index গুলো hashmap-এ রাখলে প্রতি নোড O(1)।

function buildTree(preorder, inorder) {
  const idx = new Map(inorder.map((v, i) => [v, i]));
  let pre = 0;
  const build = (lo, hi) => {
    // inorder-এর [lo, hi] অংশ
    if (lo > hi) return null;
    const root = new TreeNode(preorder[pre++]);
    const mid = idx.get(root.val);
    root.left = build(lo, mid - 1);
    root.right = build(mid + 1, hi);
    return root;
  };
  return build(0, inorder.length - 1);
}

Complexity: Time O(n), Space O(n)

প্রবলেম

  • Serialize and Deserialize BSTLC 449
    (BST হলে শুধু preorder-ই যথেষ্ট — কেন?)

    Statement: BST serialize করার এবং deserialize করার algorithm design করুন। BST property ব্যবহার করে শুধু preorder traversal দিয়েই reconstruct করা যায়।
    উদাহরণ: root=[2,1,3] → serialize → deserialize → same BST | ⚡ n ≤ 10⁴, 0 ≤ val ≤ 10⁴

    নোট · ফাঁকা