Skip to main content

Binary Search Tree in DSA


In Data Structures and Algorithms (DSA), Trees

Trees are a fundamental data structure that help in efficiently organizing and managing hierarchical data. They are used in many applications like databases, file systems, search engines, and network routing, among others.

How Trees Help in DSA:

  • Efficient Searching: Binary search trees (BST) allow fast searching, insertion, and deletion of data in O(log n) time (on average), making it much faster than linear search on an array.
  • Hierarchical Data Representation: Trees help in representing hierarchical data, like file systems or organizational charts, where each node represents a unit, and the edges represent the relationship between them.
  • Balanced Trees: Variants like AVL trees or Red-Black trees maintain balance, ensuring efficient performance in searching and updates.
  • Priority Queue: Heaps (a type of binary tree) are used in priority queues, where elements are inserted or removed based on priority rather than order of arrival.
  • Tree Traversal: Traversal algorithms like in-order, pre-order, and post-order are widely used in many scenarios like expression evaluation, syntax parsing, etc.

Example: Binary Search Tree (BST) Implementation

Let’s see an example of a Binary Search Tree (BST) in Python, and how it helps in organizing and searching data efficiently.


class Node:
    def __init__(self, key):
        self.left = None
        self.right = None
        self.value = key

class BinarySearchTree:
    def __init__(self):
        self.root = None
    
    def insert(self, root, key):
        if root is None:
            return Node(key)
        if key < root.value:
            root.left = self.insert(root.left, key)
        else:
            root.right = self.insert(root.right, key)
        return root
    
    def search(self, root, key):
        if root is None or root.value == key:
            return root
        if root.value < key:
            return self.search(root.right, key)
        return self.search(root.left, key)

    def inorder(self, root):
        return self.inorder(root.left) + [root.value] + self.inorder(root.right) if root else []

# Example Usage
bst = BinarySearchTree()
root = None

# Inserting nodes into the BST
keys = [20, 8, 22, 4, 12, 10, 14]
for key in keys:
    root = bst.insert(root, key)

# Searching for a key
search_key = 10
found_node = bst.search(root, search_key)

if found_node:
    print(f"Node {search_key} found in the tree.")
else:
    print(f"Node {search_key} not found in the tree.")

# In-order Traversal (Sorted order for BST)
print("In-order Traversal:", bst.inorder(root))

        

Explanation:

  • Node Class: Each node contains a value, a reference to the left child, and a reference to the right child.
  • insert() Method: This method inserts a new node into the tree by comparing the value to be inserted with the root. If the value is less than the current node, it goes to the left; if it's greater, it goes to the right.
  • search() Method: This method searches for a given key in the BST. It compares the key with the root and recursively searches in the left or right subtree depending on whether the key is smaller or larger than the current node's value.
  • inorder() Method: This method returns the in-order traversal of the tree (left-root-right). For a BST, this traversal gives the elements in sorted order.

Output:


Node 10 found in the tree.
In-order Traversal: [4, 8, 10, 12, 14, 20, 22]

        

Real-World Applications of Trees:

  • File System: The hierarchy of directories and files is often represented using trees, where each folder is a node and its subfolders or files are child nodes.
  • Search Engines: Binary search trees, B-trees, or tries are used to efficiently store and search a large number of documents or URLs.
  • Network Routing: Routing tables are often represented as trees or graphs, with nodes representing routers and edges representing paths between them.
  • Expression Parsing: In compilers, abstract syntax trees (ASTs) are used to represent the structure of expressions and statements in source code.

Variants of Trees:

  • Binary Search Tree (BST): Allows efficient search and insertion, but it can become unbalanced.
  • AVL Tree: A balanced BST, ensures O(log n) time for search, insertion, and deletion.
  • Red-Black Tree: Another self-balancing binary search tree.
  • Heap: A specialized tree-based structure that satisfies the heap property and is used in priority queues.

Keyword Search in Paragraphs Using Binary Search Tree (BST)

Certainly! This example adapts a Binary Search Tree (BST) to search for keywords within paragraphs and indicate their positions in a text file. Characters are not converted into numbers or tokens—instead, each paragraph and keyword is treated as a plain string.

Approach

  1. Create a Binary Search Tree (BST)
    • Each node stores a keyword
    • The BST allows fast keyword lookup
  2. Search for Keywords in Paragraphs
    • Each keyword is searched within each paragraph
    • All matching positions are recorded
  3. Indicate Keyword Positions
    • If a keyword is found, its index positions are displayed
  4. Write Results to a File
    • Results are saved in a text file for later review

Example Python Code


class Node:
    def __init__(self, key):
        self.left = None
        self.right = None
        self.value = key

class BinarySearchTree:
    def __init__(self):
        self.root = None
    
    def insert(self, root, key):
        if root is None:
            return Node(key)
        if key < root.value:
            root.left = self.insert(root.left, key)
        else:
            root.right = self.insert(root.right, key)
        return root
    
    def search(self, root, key):
        if root is None or root.value == key:
            return root
        if root.value < key:
            return self.search(root.right, key)
        return self.search(root.left, key)

def search_keyword_in_paragraph(paragraph, keyword):
    positions = []
    start = 0
    while start < len(paragraph):
        start = paragraph.find(keyword, start)
        if start == -1:
            break
        positions.append(start)
        start += len(keyword)
    return positions

def write_to_file(file_name, results):
    with open(file_name, 'w') as file:
        for result in results:
            file.write(result + '\n')

def main():
    paragraphs = [
        "This is the first paragraph. It contains some words.",
        "The second paragraph has some different words.",
        "Here is the third one. Keywords are fun to search.",
        "The fourth paragraph also has the word search."
    ]
    
    keywords = ["search", "words", "fun"]
    
    bst = BinarySearchTree()
    root = None
    for keyword in keywords:
        root = bst.insert(root, keyword)
    
    results = []
    for i, paragraph in enumerate(paragraphs):
        result = f"Paragraph {i+1}: {paragraph}\n"
        for keyword in keywords:
            if bst.search(root, keyword):
                positions = search_keyword_in_paragraph(paragraph, keyword)
                if positions:
                    result += f"Keyword '{keyword}' found at positions: {positions}\n"
                else:
                    result += f"Keyword '{keyword}' not found in this paragraph.\n"
        results.append(result)
    
    write_to_file("keyword_search_results.txt", results)

if __name__ == "__main__":
    main()

            

Explanation of the Code

  • Node Class: Stores a keyword and references to left and right child nodes
  • BinarySearchTree Class: Handles insertion and searching of keywords
  • search_keyword_in_paragraph(): Finds all positions of a keyword in a paragraph
  • write_to_file(): Saves results to a text file
  • main(): Controls the program flow and ties everything together

Example Input


Paragraph 1: This is the first paragraph. It contains some words.
Paragraph 2: The second paragraph has some different words.
Paragraph 3: Here is the third one. Keywords are fun to search.
Paragraph 4: The fourth paragraph also has the word search.

            

Example Keywords

  • search
  • words
  • fun

Example Output (keyword_search_results.txt)


Paragraph 1: This is the first paragraph. It contains some words.
Keyword 'search' not found in this paragraph.
Keyword 'words' found at positions: [41]
Keyword 'fun' not found in this paragraph.

Paragraph 2: The second paragraph has some different words.
Keyword 'search' not found in this paragraph.
Keyword 'words' found at positions: [47]
Keyword 'fun' not found in this paragraph.

Paragraph 3: Here is the third one. Keywords are fun to search.
Keyword 'search' found at positions: [56]
Keyword 'words' not found in this paragraph.
Keyword 'fun' found at positions: [35]

Paragraph 4: The fourth paragraph also has the word search.
Keyword 'search' found at positions: [50]
Keyword 'words' not found in this paragraph.
Keyword 'fun' not found in this paragraph.

            

Summary

  • BST enables fast keyword lookup
  • String-based searching preserves original text structure
  • Keyword positions are clearly tracked and stored
  • Useful for text analysis, document scanning, and indexing

 

Further Reading

  1.  


Contact Us

Name

Email *

Message *

Popular Posts

Q-function in BER vs SNR Calculation (with Simulation)

Q-function in BER vs. SNR Calculation In digital communications and signal processing, the Q-function plays a significant role in predicting system reliability. It allows engineers to quantify the probability that Gaussian noise will exceed a specific threshold, causing a bit error. What is the Q-function? The Q-function is a mathematical function representing the tail probability of the standard normal (Gaussian) distribution. It is the complementary cumulative distribution function (CCDF) of a standard Gaussian distribution. Q(x) = (1 / √(2Ï€)) ∫â‚“∞ e^(-t² / 2) dt Q-Function Interactive Simulator Move the slider to see how the "Tail Probability" (the area in red) changes. This area represents the Probability of Error (BER) . Threshold Distance ( x ) — (Simulates Increasing SNR) x = 1.0 Q(x) = 0.1587 ...

Design of CMOS Flip-Flops (SR, D, JK)

Design of CMOS Flip-Flops (SR, D, JK) A flip-flop or latch is a circuit with two stable states, used to store state information. It is the basic storage element in sequential logic and a fundamental building block in digital electronics systems, including computers and communication devices. Flip-flops and latches act as data storage elements for states, pulse counting, and synchronization of variably-timed input signals to a reference clock. Flip-flops can be transparent/opaque (latches) or clocked (synchronous, edge-triggered). Latches are level-sensitive, while flip-flops are edge-sensitive. In sequential logic, the output depends on current inputs and previous states. Fig.1 shows a sequential circuit combining a combinational block and a memory element. ...

Pulse Width Modulation (PWM)

Pulse-width modulation (PWM), or pulse-duration modulation (PDM), is a method of controlling the average power delivered by an electrical signal.   Fig: An example of PWM in an idealized inductor driven by a blue line voltage source modulated as a series of sawtooth pulses, resulting in a red line current in the inductor.    Generating a PWM Signal The simplest way to generate a PWM signal is the intersection method, which requires only a sawtooth or a triangle waveform (easily generated using a simple oscillator) and a comparator. When the value of the reference signal is more than the modulation waveform, the PWM signal (magenta) is in the high state; otherwise, it is in the low state.      Duty cycle A low duty cycle equates to low power because the power is off for most of the time; the word duty cycle reflects the ratio of "on" time to the regular interval or "period" of time. The duty cycle is measured in percent, with 100% representing full o...

BER vs SNR for M-ary QAM, M-ary PSK, QPSK, BPSK, ...(MATLAB Code + Simulator)

Bit Error Rate (BER) & SNR Guide Analyze communication system performance with our interactive simulators and MATLAB tools. 📘 Theory 🧮 Simulators 💻 MATLAB Code 📚 Resources BER Definition SNR Formula BER Calculator MATLAB Comparison 📂 Explore M-ary QAM, PSK, and QPSK Topics ▼ 🧮 Constellation Simulator: M-ary QAM 🧮 Constellation Simulator: M-ary PSK 🧮 BER calculation for ASK, FSK, and PSK 🧮 Approaches to BER vs SNR What is Bit Error Rate (BER)? The BER indicates how many corrupted bits are received compared to the total number of bits sent. It is the primary figure of merit f...

FFT Butterfly Method Explained (with Example of 4-point DFT)

  FFT Using Butterfly Method Given: x[n] = {0, 1, 2, 3} Step 1: Split into Even & Odd Even indices: x e = {0, 2} Odd indices: x o = {1, 3} Step 2: 2-point DFT For any {a, b}: DFT = {a + b, a - b} Even Part: E = {0+2, 0-2} = {2, -2} Odd Part: O = {1+3, 1-3} = {4, -2} Step 3: Combine Using Butterfly X[k] = E[k] + W k O[k] X[k + N/2] = E[k] - W k O[k] For N = 4: W 0 = 1 W 1 = -j Final Calculations X[0] = 2 + 4 = 6 X[2] = 2 - 4 = -2 X[1] = -2 + (-j)(-2) = -2 + 2j X[3] = -2 - (-j)(-2) = -2 - 2j Final Answer: X[k] = {6, -2 + 2j, -2, -2 - 2j} Try Interactive Online Simulations Interactive FFT Online Simulator (For understanding Fundamentals)  Interactive FFT Online Simulator (Analyze .CSV, .MP3, .MP4, etc. Further Reading Fourier Transform OFDM Return to Fourier Transform Main Page →

Frequency Shift Keying (FSK) Modulation & Demodulation (with Simulation)

Frequency Shift Keying (FSK) Theoretical Foundations: Frequency Shift Keying (FSK) is a discrete frequency modulation scheme wherein the digital information is encoded via instantaneous shifts in the carrier signal's frequency. The fundamental implementation is Binary FSK (BFSK), which maps binary data onto two distinct, discrete spectral states. A binary '1' (the "mark" state) is represented by a carrier frequency \( f_1 \), while a binary '0' (the "space" state) corresponds to frequency \( f_2 \). Each symbol is sustained for a bit interval denoted by \( T_b \). FSK Transmitter Characterization: The mathematical model for the modulated BFSK output \( s(t) \) is defined as: \[ s(t) = \begin{cases} A_c \cos(2\pi f_1 t), & \text{for } m = 1 \\ A_c \cos(2\pi f_2 t), & \text{for } m = 0 \end{cases} \] ...

AM Modulation Online Simulator

Amplitude Modulation Simulator s AM (t) = A c [1 + k a m(t)] cos(ω c t) where, ω = 2πf & k a = Amplitude Sensitivity Modulation index, μ = k a A m Message Frequency (fm): Carrier Frequency (fc): Carrier Amplitude (Ac): Modulation Index (m = Am / Ac):

Online Simulator for ASK, FSK, and PSK

Interactive Digital Signal Processing (DSP) Tutorial and Simulator for ASK, FSK, and BPSK modulation techniques. Try our new Digital Signal Processing Simulator!   •   Interactive ASK, FSK, and BPSK tools updated for 2025. Start Now Digital Modulation Visualizer: ASK, FSK, & BPSK Simulator Learn and visualize binary modulation techniques (ASK, FSK, BPSK) in real-time with adjustable carrier and sampling parameters. Perfect for DSP students and engineers. 📡 ASK Simulator 📶 FSK Simulator 🎚️ BPSK Simulator 📚 More Topics ASK Modulator FSK Modulator BPSK Modulator More Topics 1. ASK (Amplitude Shift Keying) Simulat...