Description:    The following C++ Binary Search Tree
code includes these functions of the Binary
Search Trees:
- Default Constructor
- Parameterized Constructor
- Copy Constructor
- Copy Tree
- Search
- Insert
- Delete
- Pre-order traversal
- In-order traversal
- Post-order traversal
- Check Equivalence
- Destructor
C++ Code
#include <iostream>
using namespace std;
struct Node_Tree
{
    int data;
    Node_Tree *left;
    Node_Tree *right;
};
struct Node_Queue
{
    Node_Tree *data_Node;
    Node_Queue *next;
};
class Queue
{
    Node_Queue dummyHead;       //Dummy head Node_Queue
    Node_Queue *tail;
    int no_of_elements;
public:
    Queue()
{
       dummyHead.next
= nullptr;
       tail
= &dummyHead;
       no_of_elements
= 0;
    }
    bool isEmpty() {
       return (dummyHead.next == nullptr);
    }
    bool enqueue(Node_Tree *obj) {
       Node_Queue *temp = new Node_Queue;
       temp->data_Node
= obj;
       temp->next
= nullptr;
       tail->next
= temp;
       tail
= temp;
       no_of_elements++;
       return true;
    }
    bool dequeue(Node_Tree *&n) {
       if (isEmpty())
           return false;
       else {
           Node_Queue *temp = dummyHead.next;
           if (temp == tail)
              tail
= &dummyHead;
           n = temp->data_Node;
           dummyHead.next
= temp->next;
           delete temp;
           return true;
       }
    }
    ~Queue()
{
       Node_Tree *n;
       while (!isEmpty())
           dequeue(n);
       tail
= nullptr;
    }
};
class BinarySearchTree
{
    Node_Tree *root;
public:
    BinarySearchTree()
{
       root
= nullptr;
    }
    BinarySearchTree(int x) {
       Node_Tree *newNode = new Node_Tree;
       newNode->data
= x;
       newNode->left
= nullptr;
       newNode->right
= nullptr;
       root
= newNode;
    }
    BinarySearchTree(BinarySearchTree &obj) {
       root
= copyTree(obj.root);
    }
    Node_Tree* copyTree(Node_Tree *n) {
       if (n == nullptr)
           return nullptr;
       Node_Tree *left = copyTree(n->left);
       Node_Tree *right = copyTree(n->right);
       Node_Tree *newNode = new Node_Tree;
       newNode->data
= n->data;
       newNode->left
= left;
       newNode->right
= right;
       return newNode;
    }
    Node_Tree* search(int key) {
       Node_Tree *curr = root;
       while (curr != nullptr) {
           if (curr->data == key)
              return curr;
           else if (key<curr->data)
              curr
= curr->left;
           else
              curr
= curr->right;
       }
       return nullptr;
    }
    void insert(int n) {
       Node_Tree *newNode = new Node_Tree;
       newNode->data
= n;
       newNode->left
= nullptr;
       newNode->right
= nullptr;
       if (root == nullptr)
           root = newNode;
       else {
           Node_Tree *curr = root;
           while (1) {
              if (n<curr->data)
                  if (curr->left == nullptr)
                     break;
                  else
                     curr
= curr->left;
              else
                  if (curr->right == nullptr)
                     break;
                  else
                     curr
= curr->right;
           }
           if (curr->left == nullptr)
              curr->left
= newNode;
           else
              curr->right
= newNode;
       }
    };
    bool deleteNode(int x) {
       Node_Tree *del = search(x);
       if (del == nullptr)
           return false;
       Node_Tree *curr = del;
       if (curr->right->left != nullptr) {
           curr
= curr->right;
           while (curr->left->left != nullptr)
              curr
= curr->left;
           del->data
= curr->left->data;
           delete curr->left;
           curr->left
= nullptr;
       }
       else {
           del->data
= curr->right->data;
           delete curr->right;
           curr->right
= nullptr;
       }
       return true;
    }
    void print_InOrder() {
       cout
<< "\t\t\tIn-Order
Printing\n\n";
       recursion_printInOrder(root);
    }
    void recursion_printInOrder(Node_Tree *n) {
       if (n == nullptr)
           return;
       recursion_printInOrder(n->left);
       cout
<< n->data << endl;
       recursion_printInOrder(n->right);
    }
    void print_PreOrder() {
       cout
<< "\t\t\tPre-Order
Printing\n\n";
       recursion_printPreOrder(root);
    }
    void recursion_printPreOrder(Node_Tree *n) {
       if (n == nullptr)
           return;
       cout
<< n->data << endl;
       recursion_printPreOrder(n->left);
       recursion_printPreOrder(n->right);
    }
    void print_PostOrder() {
       cout
<< "\t\t\tPost-Order
Printing\n\n";
       recursion_printPostOrder(root);
    }
    void recursion_printPostOrder(Node_Tree *n) {
       if (n == nullptr)
           return;
       recursion_printPostOrder(n->left);
       recursion_printPostOrder(n->right);
       cout
<< n->data << endl;
    }
    void print_LevelOrder() {
       cout
<< "\t\t\tLevel-Order
Printing\n\n";
       Queue obj;
       obj.enqueue(root);
       Node_Tree *curr;
       while (!obj.isEmpty()) {
           obj.dequeue(curr);
           cout
<< curr->data << endl;
           if (curr->left != nullptr)
              obj.enqueue(curr->left);
           if (curr->right != nullptr)
              obj.enqueue(curr->right);
       }
    }
    bool check_Equivalance(BinarySearchTree obj) {
       cout
<< "\t\t\tCHECKING
EQUIVALANCE\n\n";
       if (recursion_checkEquivalance(this->root, obj.root))
           return true;
       else
           return false;
    }
    bool recursion_checkEquivalance(Node_Tree *n1, Node_Tree *n2) {
       if (n1->left == nullptr && n1->right == nullptr && n2->left == nullptr && n2->right == nullptr)
           return true;
       if ((n1->left == n1->right && n2->left != n2->right) || (n2->left == n2->right && n1->left != n1->right)) //here
n1->left==n1->right means that both are nullptr
           return false;
       if (n1->data != n2->data)
           return false;
       if
(!recursion_checkEquivalance(n1->left, n2->left))
           return false;
       if
(!recursion_checkEquivalance(n1->right, n2->right))
           return false;
    }
    ~BinarySearchTree()
{
       recursion_Destructor(root);
    }
    void recursion_Destructor(Node_Tree *n) {
       if (n->left == nullptr && n->right == nullptr) {
           delete n;
           n = nullptr;
           return;
       }
       if (n->left != nullptr)
           recursion_Destructor(n->left);
       if (n->right != nullptr)
           recursion_Destructor(n->right);
       delete n;
       n = nullptr;
    }
};
 11:41
11:41


No comments
Post a Comment