Skip to main content

Implement Skew Heap

Skew Heap is a type of binary heap that is used to implement priority queues. It is also sometimes called a self-adjusting heap or a biased merge heap.

Skew Heap has the same shape properties as a binary heap, but unlike a binary heap, it does not maintain a strict order between parent and child nodes. Instead, it allows the heap to become unbalanced by arbitrarily swapping subtrees during merge operations.

The merge operation of Skew Heap is defined as a recursive process that merges two heaps into a single heap. This process involves swapping the left and right sub-heaps of a node before merging them. This swapping process helps to keep the heap balanced by avoiding the creation of long chains of nodes with the same priority.

One of the advantages of Skew Heap is that it has a fast merge operation. It has an amortized time complexity of O(log n) per merge, where n is the total number of elements in the heap. This makes it useful in situations where frequent merging of priority queues is required.

However, Skew Heap has a worst-case time complexity of O(n) for certain operations such as delete-min, where n is the number of elements in the heap. This can make it inefficient for certain types of operations, especially when the heap is heavily skewed.

Here given code implementation process.

/*
    C Program 
    Skew heap
*/
#include <stdio.h>
#include <stdlib.h>

// Tree Node
struct TreeNode
{
    int data;
    struct TreeNode*left;
    struct TreeNode*right;
};

// SkewHeap Tree
struct SkewHeap
{
    struct TreeNode*root;
};

// Create new tree
struct SkewHeap* new_tree()
{

    // Create dynamic node
    struct SkewHeap *tree = (struct SkewHeap *) malloc(sizeof(struct SkewHeap));
    if (tree != NULL)
    {
        
        tree->root = NULL;
    }
    else
    {

        printf("Memory Overflow to Create SkewHeap Tree\n");
    }
    //return new tree
    return tree;
}
// returns a new node of tree
struct TreeNode* new_node(int data)
{

    // Create dynamic node
    struct TreeNode *node = (struct TreeNode *) malloc(sizeof(struct TreeNode));
    if (node != NULL)
    {
        //Set data and pointer values
        node->data = data;
        node->left = NULL;
        node->right = NULL;
    }
    else
    {
        //This is indicates, segmentation fault or memory overflow problem
        printf("Memory Overflow\n");
    }
    //return new node
    return node;
}

//Swap the child of given node
void swap_child(struct TreeNode*parent)
{
    if(parent != NULL)
    {
        struct TreeNode * temp = parent->left;
        parent->left = parent->right;
        parent->right = temp;
    }
}
//Merge nodes of given two SkewHeap tree
struct TreeNode *merge_node(struct TreeNode *n1,struct TreeNode *n2)
{
    if(n1==NULL)
    {
        return n2;
    }
    if(n2==NULL)
    {
        return n1;
    }
    if(n1->data < n2->data)
    {
        struct TreeNode * temp = n1->right;

        n1->right = n1->left;

        n1->left = merge_node(n2, temp);

        return n1; 
    }
    else
    {
        return merge_node(n2, n1);
    }
}

// Handles the request of adding a new node in SkewHeap 
void add_node(struct SkewHeap *tree ,int data)
{

    struct TreeNode *node = new_node(data);

    tree->root = merge_node(node,tree->root);

}
void inorder(struct TreeNode *node)
{
    if (node!=NULL)
    {
  
        inorder(node->left);
        //Print node value
        printf("  %d", node->data);
        inorder(node->right);
    }
}
void preorder(struct TreeNode *node)
{
    if (node!=NULL)
    {
  
         //Print node value
        printf("  %d", node->data);

        preorder(node->left);
       
        preorder(node->right);
    }
}

void postorder(struct TreeNode *node)
{
    if (node!=NULL)
    {
  
    
        postorder(node->left);
       
        postorder(node->right);

        //Print node value
        printf("  %d", node->data);
    }
}

// Handles the request of view tree elements
void print_tree(struct SkewHeap *tree)
{

    if(tree->root!=NULL)
    {
        // Display tree elements
        printf("\n Preorder : ");
        preorder(tree->root);
        printf("\n Inorder : ");
        inorder(tree->root);
        printf("\n Postorder : " );
        postorder(tree->root);
        printf("\n");
    }
    else
    {
        printf("\n Empty Tree");
    }
}
//Handles the request to merge two SkewHeap trees
void merge_tree(struct SkewHeap *tree1,struct SkewHeap *tree2)
{

    tree1->root = merge_node(tree1->root,tree2->root);
    tree2->root = NULL;
}

void delete_min(struct SkewHeap *tree)
{
    if(tree->root==NULL)
    {
        printf("\nEmpty Tree\n");
    }
    else
    {
        tree->root = merge_node(tree->root->left,tree->root->right);

    }
    
}

//Print Min element of tree
void min_element(struct SkewHeap *tree)
{
    if(tree->root==NULL)
    {
        printf("\nEmpty Tree\n");
    }
    else
    {
        printf("\n Min Element : %d \n",tree->root->data );
    }
}
int main()
{
    struct SkewHeap *tree1 = new_tree();

    // Added nodes
    add_node(tree1, 6);
    add_node(tree1, 9);
    add_node(tree1, 11);
    add_node(tree1, 3);
    add_node(tree1, 2);
    add_node(tree1, 45);
    add_node(tree1, 70);
    add_node(tree1, 4);
    add_node(tree1, 13);
    /*
              2
            /  \ 
           /    \
          3      4
         / \    / 
        6   70 45   
       / \
      9   11
     /
    13    
    ----------------------------
    Constructing Binary Swap heap tree
    ----------------------------
    */
    
    print_tree(tree1);

    struct SkewHeap *tree2 = new_tree();


    // Put tree nodes
    add_node(tree2, 5);
    add_node(tree2, 9);
    add_node(tree2, 41);
    add_node(tree2, 8);
    add_node(tree2, 12);
    add_node(tree2, 50);
    add_node(tree2, 100);
    add_node(tree2, 120);
    add_node(tree2, 150);
    /*

              5 
            /   \ 
           /     \
          12      8
         / \     /  \
        41 100  9   50
       /       /
     150      120
    ----------------------------
    Constructing Binary Swap heap tree 
    ----------------------------
    */
    print_tree(tree2);


    printf("\n Merge Two Tree \n");
    
    merge_tree(tree1,tree2);
    
    /*
    After merge two tree

                      2
                     / \ 
                    /   \
                   /     \
                  /       \
                 /         \
                /           \
               /             \
              4               3
             /  \            / \
            /    \          /   \
           5     45        6     70
          /  \            / \
         /    \          /   \
       12       8       9     11
      /  \     / \     /
     41  100  9   50  13
    /        /
   150      120 
    -------------------------------------
    */
    printf("\n Tree 1");
    print_tree(tree1);
    printf("\n Tree 2");
    print_tree(tree2);

    printf("\n\n Delete Min ");
    min_element(tree1);

    delete_min(tree1);

    /*
    --------------------------
    After Delete min element [2]
    --------------------------

                      3
                     / \ 
                    /   \
                   /     \
                  /       \
                 /         \
                /           \
               /             \
              4               6
             / \             / \
            /   \           /   \
           45    5         9     11
          /     / \       / 
         /     /   \     /   
       70    12     8   13     
            /  \   / \
           41 100 9  50
          /      /
        150    120 
    -------------------------------------
    */
    print_tree(tree1);
    return 0;
}

Output

 Preorder :   2  3  6  9  13  11  70  4  45
 Inorder :   13  9  6  11  3  70  2  45  4
 Postorder :   13  9  11  6  70  3  45  4  2

 Preorder :   5  12  41  150  100  8  9  120  50
 Inorder :   150  41  12  100  5  120  9  8  50
 Postorder :   150  41  100  12  120  9  50  8  5

 Merge Two Tree

 Tree 1
 Preorder :   2  4  5  12  41  150  100  8  9  120  50  45  3  6  9  13  11  70
 Inorder :   150  41  12  100  5  120  9  8  50  4  45  2  13  9  6  11  3  70
 Postorder :   150  41  100  12  120  9  50  8  5  45  4  13  9  11  6  70  3  2

 Tree 2
 Empty Tree

 Delete Min
 Min Element : 2

 Preorder :   3  4  45  70  5  12  41  150  100  8  9  120  50  6  9  13  11
 Inorder :   70  45  4  150  41  12  100  5  120  9  8  50  3  13  9  6  11
 Postorder :   70  45  150  41  100  12  120  9  50  8  5  4  13  9  11  6  3
/*
    Java Program 
    Implement Skew heap
*/
// Tree Node
class TreeNode
{
    public int data;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int data)
    {
        this.data = data;
        this.left = null;
        this.right = null;
    }
}
// SkewHeap 
public class SkewHeap
{
    public TreeNode root;
    public SkewHeap()
    {
        this.root = null;
    }
    //Swap the child of given node
    public void swap_child(TreeNode parent)
    {
        if (parent != null)
        {
            TreeNode temp = parent.left;
            parent.left = parent.right;
            parent.right = temp;
        }
    }
    //Merge nodes of given two SkewHeap tree
    public TreeNode merge_node(TreeNode n1, TreeNode n2)
    {
        if (n1 == null)
        {
            return n2;
        }
        if (n2 == null)
        {
            return n1;
        }
        if (n1.data < n2.data)
        {
            TreeNode temp = n1.right;
            n1.right = n1.left;
            n1.left = merge_node(n2, temp);
            return n1;
        }
        else
        {
            return merge_node(n2, n1);
        }
    }
    // Handles the request of adding a new node in SkewHeap tree
    public void add_node(int data)
    {
        TreeNode node = new TreeNode(data);
        this.root = merge_node(node, this.root);
    }
    public void inorder(TreeNode node)
    {
        if (node != null)
        {
            inorder(node.left);
            //Print node value
            System.out.print("  " + node.data);
            inorder(node.right);
        }
    }
    public void preorder(TreeNode node)
    {
        if (node != null)
        {
            //Print node value
            System.out.print("  " + node.data);
            preorder(node.left);
            preorder(node.right);
        }
    }
    public void postorder(TreeNode node)
    {
        if (node != null)
        {
            postorder(node.left);
            postorder(node.right);
            //Print node value
            System.out.print("  " + node.data);
        }
    }
    // Handles the request of view tree elements
    public void print_tree()
    {
        if (this.root != null)
        {
            // Display tree elements
            System.out.print("\n Preorder : ");
            preorder(this.root);
            System.out.print("\n Inorder : ");
            inorder(this.root);
            System.out.print("\n Postorder : ");
            postorder(this.root);
            System.out.print("\n");
        }
        else
        {
            System.out.print("\n Empty Tree");
        }
    }
    //Handles the request to merge two trees
    public void merge_tree(SkewHeap tree2)
    {
        this.root = merge_node(this.root, tree2.root);
        tree2.root = null;
    }
    public void delete_min()
    {
        if (this.root == null)
        {
            System.out.print("\nEmpty Tree\n");
        }
        else
        {
            this.root = merge_node(this.root.left, this.root.right);
        }
    }
    //Print Min element of tree
    public void min_element()
    {
        if (this.root == null)
        {
            System.out.print("\nEmpty Tree\n");
        }
        else
        {
            System.out.print("\n Min Element : " + this.root.data + " \n");
        }
    }
    public static void main(String[] args)
    {
        SkewHeap tree1 = new SkewHeap();
        SkewHeap tree2 = new SkewHeap();
        // Added nodes
        tree1.add_node(6);
        tree1.add_node(9);
        tree1.add_node(11);
        tree1.add_node(3);
        tree1.add_node(2);
        tree1.add_node(45);
        tree1.add_node(70);
        tree1.add_node(4);
        tree1.add_node(13);
        /*
                  2
                /  \ 
               /    \
              3      4
             / \    / 
            6   70 45   
           / \
          9   11
         /
        13    
        ----------------------------
        Constructing Binary Swap heap tree
        ----------------------------
        */
        tree1.print_tree();
        // Put tree nodes
        tree2.add_node(5);
        tree2.add_node(9);
        tree2.add_node(41);
        tree2.add_node(8);
        tree2.add_node(12);
        tree2.add_node(50);
        tree2.add_node(100);
        tree2.add_node(120);
        tree2.add_node(150);
        /*

                  5 
                /   \ 
               /     \
              12      8
             / \     /  \
            41 100  9   50
           /       /
         150      120
        ----------------------------
        Constructing Binary Swap heap tree 
        ----------------------------
        */
        tree2.print_tree();
        System.out.print("\n Merge Two Tree \n");
        tree1.merge_tree(tree2);
        /*
            After merge two tree

                          2
                         / \ 
                        /   \
                       /     \
                      /       \
                     /         \
                    /           \
                   /             \
                  4               3
                 /  \            / \
                /    \          /   \
               5     45        6     70
              /  \            / \
             /    \          /   \
           12       8       9     11
          /  \     / \     /
         41  100  9   50  13
        /        /
       150      120 
        -------------------------------------
        */
        System.out.print("\n Tree 1");
        tree1.print_tree();
        System.out.print("\n Tree 2");
        tree2.print_tree();
        System.out.print("\n\n Delete Min ");
        tree1.min_element();
        tree1.delete_min();
        /*
        --------------------------
        After Delete min element [2]
        --------------------------

                      3
                     / \ 
                    /   \
                   /     \
                  /       \
                 /         \
                /           \
               /             \
              4               6
             / \             / \
            /   \           /   \
           45    5         9     11
          /     / \       / 
         /     /   \     /   
       70    12     8   13     
            /  \   / \
           41 100 9  50
          /      /
        150    120 
        -------------------------------------
        */
        tree1.print_tree();
    }
}

Output

 Preorder :   2  3  6  9  13  11  70  4  45
 Inorder :   13  9  6  11  3  70  2  45  4
 Postorder :   13  9  11  6  70  3  45  4  2

 Preorder :   5  12  41  150  100  8  9  120  50
 Inorder :   150  41  12  100  5  120  9  8  50
 Postorder :   150  41  100  12  120  9  50  8  5

 Merge Two Tree

 Tree 1
 Preorder :   2  4  5  12  41  150  100  8  9  120  50  45  3  6  9  13  11  70
 Inorder :   150  41  12  100  5  120  9  8  50  4  45  2  13  9  6  11  3  70
 Postorder :   150  41  100  12  120  9  50  8  5  45  4  13  9  11  6  70  3  2

 Tree 2
 Empty Tree

 Delete Min
 Min Element : 2

 Preorder :   3  4  45  70  5  12  41  150  100  8  9  120  50  6  9  13  11
 Inorder :   70  45  4  150  41  12  100  5  120  9  8  50  3  13  9  6  11
 Postorder :   70  45  150  41  100  12  120  9  50  8  5  4  13  9  11  6  3
// Include header file
#include <iostream>
using namespace std;

/*
    C++ Program 
    Implement Skew heap
*/

//  Tree Node
class TreeNode
{
    public: int data;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int data)
    {
        this->data = data;
        this->left = NULL;
        this->right = NULL;
    }
};
//  SkewHeap
class SkewHeap
{
    public: TreeNode *root;
    SkewHeap()
    {
        this->root = NULL;
    }
    // Swap the child of given node
    void swap_child(TreeNode *parent)
    {
        if (parent != NULL)
        {
            TreeNode *temp = parent->left;
            parent->left = parent->right;
            parent->right = temp;
        }
    }
    // Merge nodes of given two SkewHeap tree
    TreeNode *merge_node(TreeNode *n1, TreeNode *n2)
    {
        if (n1 == NULL)
        {
            return n2;
        }
        if (n2 == NULL)
        {
            return n1;
        }
        if (n1->data < n2->data)
        {
            TreeNode *temp = n1->right;
            n1->right = n1->left;
            n1->left = this->merge_node(n2, temp);
            return n1;
        }
        else
        {
            return this->merge_node(n2, n1);
        }
    }
    //  Handles the request of adding a new node in SkewHeap tree
    void add_node(int data)
    {
        TreeNode *node = new TreeNode(data);
        this->root = this->merge_node(node, this->root);
    }
    void inorder(TreeNode *node)
    {
        if (node != NULL)
        {
            this->inorder(node->left);
            // Print node value
            cout << "  " << node->data;
            this->inorder(node->right);
        }
    }
    void preorder(TreeNode *node)
    {
        if (node != NULL)
        {
            // Print node value
            cout << "  " << node->data;
            this->preorder(node->left);
            this->preorder(node->right);
        }
    }
    void postorder(TreeNode *node)
    {
        if (node != NULL)
        {
            this->postorder(node->left);
            this->postorder(node->right);
            // Print node value
            cout << "  " << node->data;
        }
    }
    //  Handles the request of view tree elements
    void print_tree()
    {
        if (this->root != NULL)
        {
            //  Display tree elements
            cout << "\n Preorder : ";
            this->preorder(this->root);
            cout << "\n Inorder : ";
            this->inorder(this->root);
            cout << "\n Postorder : ";
            this->postorder(this->root);
            cout << "\n";
        }
        else
        {
            cout << "\n Empty Tree";
        }
    }
    // Handles the request to merge two trees
    void merge_tree(SkewHeap &tree2)
    {
        this->root = this->merge_node(this->root, tree2.root);
        tree2.root = NULL;
    }
    void delete_min()
    {
        if (this->root == NULL)
        {
            cout << "\nEmpty Tree\n";
        }
        else
        {
            this->root = this->merge_node(this->root->left, this->root->right);
        }
    }
    // Print Min element of tree
    void min_element()
    {
        if (this->root == NULL)
        {
            cout << "\nEmpty Tree\n";
        }
        else
        {
            cout << "\n Min Element : " << this->root->data << " \n";
        }
    }
};
int main()
{
    SkewHeap tree1 = SkewHeap();
    SkewHeap tree2 = SkewHeap();
    //  Added nodes
    tree1.add_node(6);
    tree1.add_node(9);
    tree1.add_node(11);
    tree1.add_node(3);
    tree1.add_node(2);
    tree1.add_node(45);
    tree1.add_node(70);
    tree1.add_node(4);
    tree1.add_node(13);
    /*
                  2
                /  \ 
               /    \
              3      4
             / \    / 
            6   70 45   
           / \
          9   11
         /
        13    
        ----------------------------
        Constructing Binary Swap heap tree
        ----------------------------
    */
    tree1.print_tree();
    //  Put tree nodes
    tree2.add_node(5);
    tree2.add_node(9);
    tree2.add_node(41);
    tree2.add_node(8);
    tree2.add_node(12);
    tree2.add_node(50);
    tree2.add_node(100);
    tree2.add_node(120);
    tree2.add_node(150);
    /*

                  5 
                /   \ 
               /     \
              12      8
             / \     /  \
            41 100  9   50
           /       /
         150      120
        ----------------------------
        Constructing Binary Swap heap tree 
        ----------------------------
    */
    tree2.print_tree();
    cout << "\n Merge Two Tree \n";
    tree1.merge_tree(tree2);
    /*
        After merge two tree

                          2
                         / \ 
                        /   \
                       /     \
                      /       \
                     /         \
                    /           \
                   /             \
                  4               3
                 /  \            / \
                /    \          /   \
               5     45        6     70
              /  \            / \
             /    \          /   \
           12       8       9     11
          /  \     / \     /
         41  100  9   50  13
        /        /
       150      120 
        -------------------------------------
    */
    cout << "\n Tree 1";
    tree1.print_tree();
    cout << "\n Tree 2";
    tree2.print_tree();
    cout << "\n\n Delete Min ";
    tree1.min_element();
    tree1.delete_min();
    /*
        --------------------------
        After Delete min element [2]
        --------------------------

                      3
                     / \ 
                    /   \
                   /     \
                  /       \
                 /         \
                /           \
               /             \
              4               6
             / \             / \
            /   \           /   \
           45    5         9     11
          /     / \       / 
         /     /   \     /   
       70    12     8   13     
            /  \   / \
           41 100 9  50
          /      /
        150    120 
    -------------------------------------
    */
    tree1.print_tree();
    return 0;
}

Output

 Preorder :   2  3  6  9  13  11  70  4  45
 Inorder :   13  9  6  11  3  70  2  45  4
 Postorder :   13  9  11  6  70  3  45  4  2

 Preorder :   5  12  41  150  100  8  9  120  50
 Inorder :   150  41  12  100  5  120  9  8  50
 Postorder :   150  41  100  12  120  9  50  8  5

 Merge Two Tree

 Tree 1
 Preorder :   2  4  5  12  41  150  100  8  9  120  50  45  3  6  9  13  11  70
 Inorder :   150  41  12  100  5  120  9  8  50  4  45  2  13  9  6  11  3  70
 Postorder :   150  41  100  12  120  9  50  8  5  45  4  13  9  11  6  70  3  2

 Tree 2
 Empty Tree

 Delete Min
 Min Element : 2

 Preorder :   3  4  45  70  5  12  41  150  100  8  9  120  50  6  9  13  11
 Inorder :   70  45  4  150  41  12  100  5  120  9  8  50  3  13  9  6  11
 Postorder :   70  45  150  41  100  12  120  9  50  8  5  4  13  9  11  6  3
// Include namespace system
using System;

/*
    C# Program 
    Implement Skew heap
*/

//  Tree Node
public class TreeNode
{
    public int data;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int data)
    {
        this.data = data;
        this.left = null;
        this.right = null;
    }
}
//  SkewHeap
public class SkewHeap
{
    public TreeNode root;
    public SkewHeap()
    {
        this.root = null;
    }
    // Swap the child of given node
    public void swap_child(TreeNode parent)
    {
        if (parent != null)
        {
            TreeNode temp = parent.left;
            parent.left = parent.right;
            parent.right = temp;
        }
    }
    // Merge nodes of given two SkewHeap tree
    public TreeNode merge_node(TreeNode n1, TreeNode n2)
    {
        if (n1 == null)
        {
            return n2;
        }
        if (n2 == null)
        {
            return n1;
        }
        if (n1.data < n2.data)
        {
            TreeNode temp = n1.right;
            n1.right = n1.left;
            n1.left = merge_node(n2, temp);
            return n1;
        }
        else
        {
            return merge_node(n2, n1);
        }
    }
    //  Handles the request of adding a new node in SkewHeap tree
    public void add_node(int data)
    {
        TreeNode node = new TreeNode(data);
        this.root = merge_node(node, this.root);
    }
    public void inorder(TreeNode node)
    {
        if (node != null)
        {
            inorder(node.left);
            // Print node value
            Console.Write("  " + node.data);
            inorder(node.right);
        }
    }
    public void preorder(TreeNode node)
    {
        if (node != null)
        {
            // Print node value
            Console.Write("  " + node.data);
            preorder(node.left);
            preorder(node.right);
        }
    }
    public void postorder(TreeNode node)
    {
        if (node != null)
        {
            postorder(node.left);
            postorder(node.right);
            // Print node value
            Console.Write("  " + node.data);
        }
    }
    //  Handles the request of view tree elements
    public void print_tree()
    {
        if (this.root != null)
        {
            //  Display tree elements
            Console.Write("\n Preorder : ");
            preorder(this.root);
            Console.Write("\n Inorder : ");
            inorder(this.root);
            Console.Write("\n Postorder : ");
            postorder(this.root);
            Console.Write("\n");
        }
        else
        {
            Console.Write("\n Empty Tree");
        }
    }
    // Handles the request to merge two trees
    public void merge_tree(SkewHeap tree2)
    {
        this.root = merge_node(this.root, tree2.root);
        tree2.root = null;
    }
    public void delete_min()
    {
        if (this.root == null)
        {
            Console.Write("\nEmpty Tree\n");
        }
        else
        {
            this.root = merge_node(this.root.left, this.root.right);
        }
    }
    // Print Min element of tree
    public void min_element()
    {
        if (this.root == null)
        {
            Console.Write("\nEmpty Tree\n");
        }
        else
        {
            Console.Write("\n Min Element : " + this.root.data + " \n");
        }
    }
    public static void Main(String[] args)
    {
        SkewHeap tree1 = new SkewHeap();
        SkewHeap tree2 = new SkewHeap();
        //  Added nodes
        tree1.add_node(6);
        tree1.add_node(9);
        tree1.add_node(11);
        tree1.add_node(3);
        tree1.add_node(2);
        tree1.add_node(45);
        tree1.add_node(70);
        tree1.add_node(4);
        tree1.add_node(13);
        /*
                      2
                    /  \ 
                   /    \
                  3      4
                 / \    / 
                6   70 45   
               / \
              9   11
             /
            13    
            ----------------------------
            Constructing Binary Swap heap tree
            ----------------------------
        */
        tree1.print_tree();
        //  Put tree nodes
        tree2.add_node(5);
        tree2.add_node(9);
        tree2.add_node(41);
        tree2.add_node(8);
        tree2.add_node(12);
        tree2.add_node(50);
        tree2.add_node(100);
        tree2.add_node(120);
        tree2.add_node(150);
        /*

                      5 
                    /   \ 
                   /     \
                  12      8
                 / \     /  \
                41 100  9   50
               /       /
             150      120
            ----------------------------
            Constructing Binary Swap heap tree 
            ----------------------------
        */
        tree2.print_tree();
        Console.Write("\n Merge Two Tree \n");
        tree1.merge_tree(tree2);
        /*
                After merge two tree

                              2
                             / \ 
                            /   \
                           /     \
                          /       \
                         /         \
                        /           \
                       /             \
                      4               3
                     /  \            / \
                    /    \          /   \
                   5     45        6     70
                  /  \            / \
                 /    \          /   \
               12       8       9     11
              /  \     / \     /
             41  100  9   50  13
            /        /
           150      120 
        -------------------------------------
        */
        Console.Write("\n Tree 1");
        tree1.print_tree();
        Console.Write("\n Tree 2");
        tree2.print_tree();
        Console.Write("\n\n Delete Min ");
        tree1.min_element();
        tree1.delete_min();
        /*
            --------------------------
            After Delete min element [2]
            --------------------------

                          3
                         / \ 
                        /   \
                       /     \
                      /       \
                     /         \
                    /           \
                   /             \
                  4               6
                 / \             / \
                /   \           /   \
               45    5         9     11
              /     / \       / 
             /     /   \     /   
           70    12     8   13     
                /  \   / \
               41 100 9  50
              /      /
            150    120 
        -------------------------------------
        */
        tree1.print_tree();
    }
}

Output

 Preorder :   2  3  6  9  13  11  70  4  45
 Inorder :   13  9  6  11  3  70  2  45  4
 Postorder :   13  9  11  6  70  3  45  4  2

 Preorder :   5  12  41  150  100  8  9  120  50
 Inorder :   150  41  12  100  5  120  9  8  50
 Postorder :   150  41  100  12  120  9  50  8  5

 Merge Two Tree

 Tree 1
 Preorder :   2  4  5  12  41  150  100  8  9  120  50  45  3  6  9  13  11  70
 Inorder :   150  41  12  100  5  120  9  8  50  4  45  2  13  9  6  11  3  70
 Postorder :   150  41  100  12  120  9  50  8  5  45  4  13  9  11  6  70  3  2

 Tree 2
 Empty Tree

 Delete Min
 Min Element : 2

 Preorder :   3  4  45  70  5  12  41  150  100  8  9  120  50  6  9  13  11
 Inorder :   70  45  4  150  41  12  100  5  120  9  8  50  3  13  9  6  11
 Postorder :   70  45  150  41  100  12  120  9  50  8  5  4  13  9  11  6  3
<?php
/*
    Php Program 
    Implement Skew heap
*/

//  Tree Node
class TreeNode
{
    public $data;
    public $left;
    public $right;

    function __construct($data)
    {
        $this->data = $data;
        $this->left = null;
        $this->right = null;
    }
}
//  SkewHeap
class SkewHeap
{
    public $root;

    function __construct()
    {
        $this->root = null;
    }
    // Swap the child of given node
    public  function swap_child($parent)
    {
        if ($parent != null)
        {
            $temp = $parent->left;
            $parent->left = $parent->right;
            $parent->right = $temp;
        }
    }
    // Merge nodes of given two SkewHeap tree
    public  function merge_node($n1, $n2)
    {
        if ($n1 == null)
        {
            return $n2;
        }
        if ($n2 == null)
        {
            return $n1;
        }
        if ($n1->data < $n2->data)
        {
            $temp = $n1->right;
            $n1->right = $n1->left;
            $n1->left = $this->merge_node($n2, $temp);
            return $n1;
        }
        else
        {
            return $this->merge_node($n2, $n1);
        }
    }
    //  Handles the request of adding a new node in SkewHeap tree
    public  function add_node($data)
    {
        $node = new TreeNode($data);
        $this->root = $this->merge_node($node, $this->root);
    }
    public  function inorder($node)
    {
        if ($node != null)
        {
            $this->inorder($node->left);
            // Print node value
            echo "  ". $node->data;
            $this->inorder($node->right);
        }
    }
    public  function preorder($node)
    {
        if ($node != null)
        {
            // Print node value
            echo "  ". $node->data;
            $this->preorder($node->left);
            $this->preorder($node->right);
        }
    }
    public  function postorder($node)
    {
        if ($node != null)
        {
            $this->postorder($node->left);
            $this->postorder($node->right);
            // Print node value
            echo "  ". $node->data;
        }
    }
    //  Handles the request of view tree elements
    public  function print_tree()
    {
        if ($this->root != null)
        {
            //  Display tree elements
            echo "\n Preorder : ";
            $this->preorder($this->root);
            echo "\n Inorder : ";
            $this->inorder($this->root);
            echo "\n Postorder : ";
            $this->postorder($this->root);
            echo "\n";
        }
        else
        {
            echo "\n Empty Tree";
        }
    }
    // Handles the request to merge two trees
    public  function merge_tree($tree2)
    {
        $this->root = $this->merge_node($this->root, $tree2->root);
        $tree2->root = null;
    }
    public  function delete_min()
    {
        if ($this->root == null)
        {
            echo "\nEmpty Tree\n";
        }
        else
        {
            $this->root = $this->merge_node($this->root->left, $this->root->right);
        }
    }
    // Print Min element of tree
    public  function min_element()
    {
        if ($this->root == null)
        {
            echo "\nEmpty Tree\n";
        }
        else
        {
            echo "\n Min Element : ". $this->root->data ." \n";
        }
    }
}

function main()
{
    $tree1 = new SkewHeap();
    $tree2 = new SkewHeap();
    //  Added nodes
    $tree1->add_node(6);
    $tree1->add_node(9);
    $tree1->add_node(11);
    $tree1->add_node(3);
    $tree1->add_node(2);
    $tree1->add_node(45);
    $tree1->add_node(70);
    $tree1->add_node(4);
    $tree1->add_node(13);
    /*
              2
            /  \ 
           /    \
          3      4
         / \    / 
        6   70 45   
       / \
      9   11
     /
    13    
    ----------------------------
    Constructing Binary Swap heap tree
    ----------------------------
    */
    $tree1->print_tree();
    //  Put tree nodes
    $tree2->add_node(5);
    $tree2->add_node(9);
    $tree2->add_node(41);
    $tree2->add_node(8);
    $tree2->add_node(12);
    $tree2->add_node(50);
    $tree2->add_node(100);
    $tree2->add_node(120);
    $tree2->add_node(150);
    /*

              5 
            /   \ 
           /     \
          12      8
         / \     /  \
        41 100  9   50
       /       /
     150      120
    ----------------------------
    Constructing Binary Swap heap tree 
    ----------------------------
    */
    $tree2->print_tree();
    echo "\n Merge Two Tree \n";
    $tree1->merge_tree($tree2);
    /*
        After merge two tree

                      2
                     / \ 
                    /   \
                   /     \
                  /       \
                 /         \
                /           \
               /             \
              4               3
             /  \            / \
            /    \          /   \
           5     45        6     70
          /  \            / \
         /    \          /   \
       12       8       9     11
      /  \     / \     /
     41  100  9   50  13
    /        /
   150      120 
    -------------------------------------
    */
    echo "\n Tree 1";
    $tree1->print_tree();
    echo "\n Tree 2";
    $tree2->print_tree();
    echo "\n\n Delete Min ";
    $tree1->min_element();
    $tree1->delete_min();
    /*
    --------------------------
    After Delete min element [2]
    --------------------------

                  3
                 / \ 
                /   \
               /     \
              /       \
             /         \
            /           \
           /             \
          4               6
         / \             / \
        /   \           /   \
       45    5         9     11
      /     / \       / 
     /     /   \     /   
   70    12     8   13     
        /  \   / \
       41 100 9  50
      /      /
    150    120 
    -------------------------------------
    */
    $tree1->print_tree();
}
main();

Output

 Preorder :   2  3  6  9  13  11  70  4  45
 Inorder :   13  9  6  11  3  70  2  45  4
 Postorder :   13  9  11  6  70  3  45  4  2

 Preorder :   5  12  41  150  100  8  9  120  50
 Inorder :   150  41  12  100  5  120  9  8  50
 Postorder :   150  41  100  12  120  9  50  8  5

 Merge Two Tree

 Tree 1
 Preorder :   2  4  5  12  41  150  100  8  9  120  50  45  3  6  9  13  11  70
 Inorder :   150  41  12  100  5  120  9  8  50  4  45  2  13  9  6  11  3  70
 Postorder :   150  41  100  12  120  9  50  8  5  45  4  13  9  11  6  70  3  2

 Tree 2
 Empty Tree

 Delete Min
 Min Element : 2

 Preorder :   3  4  45  70  5  12  41  150  100  8  9  120  50  6  9  13  11
 Inorder :   70  45  4  150  41  12  100  5  120  9  8  50  3  13  9  6  11
 Postorder :   70  45  150  41  100  12  120  9  50  8  5  4  13  9  11  6  3
/*
    Node Js Program 
    Implement Skew heap
*/
//  Tree Node
class TreeNode
{
    constructor(data)
    {
        this.data = data;
        this.left = null;
        this.right = null;
    }
}
//  SkewHeap
class SkewHeap
{
    constructor()
    {
        this.root = null;
    }
    // Swap the child of given node
    swap_child(parent)
    {
        if (parent != null)
        {
            var temp = parent.left;
            parent.left = parent.right;
            parent.right = temp;
        }
    }
    // Merge nodes of given two SkewHeap tree
    merge_node(n1, n2)
    {
        if (n1 == null)
        {
            return n2;
        }
        if (n2 == null)
        {
            return n1;
        }
        if (n1.data < n2.data)
        {
            var temp = n1.right;
            n1.right = n1.left;
            n1.left = this.merge_node(n2, temp);
            return n1;
        }
        else
        {
            return this.merge_node(n2, n1);
        }
    }
    //  Handles the request of adding a new node in SkewHeap tree
    add_node(data)
    {
        var node = new TreeNode(data);
        this.root = this.merge_node(node, this.root);
    }
    inorder(node)
    {
        if (node != null)
        {
            this.inorder(node.left);
            // Print node value
            process.stdout.write("  " + node.data);
            this.inorder(node.right);
        }
    }
    preorder(node)
    {
        if (node != null)
        {
            // Print node value
            process.stdout.write("  " + node.data);
            this.preorder(node.left);
            this.preorder(node.right);
        }
    }
    postorder(node)
    {
        if (node != null)
        {
            this.postorder(node.left);
            this.postorder(node.right);
            // Print node value
            process.stdout.write("  " + node.data);
        }
    }
    //  Handles the request of view tree elements
    print_tree()
    {
        if (this.root != null)
        {
            //  Display tree elements
            process.stdout.write("\n Preorder : ");
            this.preorder(this.root);
            process.stdout.write("\n Inorder : ");
            this.inorder(this.root);
            process.stdout.write("\n Postorder : ");
            this.postorder(this.root);
            process.stdout.write("\n");
        }
        else
        {
            process.stdout.write("\n Empty Tree");
        }
    }
    // Handles the request to merge two trees
    merge_tree(tree2)
    {
        this.root = this.merge_node(this.root, tree2.root);
        tree2.root = null;
    }
    delete_min()
    {
        if (this.root == null)
        {
            process.stdout.write("\nEmpty Tree\n");
        }
        else
        {
            this.root = this.merge_node(this.root.left, this.root.right);
        }
    }
    // Print Min element of tree
    min_element()
    {
        if (this.root == null)
        {
            process.stdout.write("\nEmpty Tree\n");
        }
        else
        {
            process.stdout.write("\n Min Element : " + this.root.data + " \n");
        }
    }
}

function main()
{
    var tree1 = new SkewHeap();
    var tree2 = new SkewHeap();
    //  Added nodes
    tree1.add_node(6);
    tree1.add_node(9);
    tree1.add_node(11);
    tree1.add_node(3);
    tree1.add_node(2);
    tree1.add_node(45);
    tree1.add_node(70);
    tree1.add_node(4);
    tree1.add_node(13);
    /*
              2
            /  \ 
           /    \
          3      4
         / \    / 
        6   70 45   
       / \
      9   11
     /
    13    
    ----------------------------
    Constructing Binary Swap heap tree
    ----------------------------
    */
    tree1.print_tree();
    //  Put tree nodes
    tree2.add_node(5);
    tree2.add_node(9);
    tree2.add_node(41);
    tree2.add_node(8);
    tree2.add_node(12);
    tree2.add_node(50);
    tree2.add_node(100);
    tree2.add_node(120);
    tree2.add_node(150);
    /*

              5 
            /   \ 
           /     \
          12      8
         / \     /  \
        41 100  9   50
       /       /
     150      120
    ----------------------------
    Constructing Binary Swap heap tree 
    ----------------------------
    */
    tree2.print_tree();
    process.stdout.write("\n Merge Two Tree \n");
    tree1.merge_tree(tree2);
    /*
        After merge two tree

                      2
                     / \ 
                    /   \
                   /     \
                  /       \
                 /         \
                /           \
               /             \
              4               3
             /  \            / \
            /    \          /   \
           5     45        6     70
          /  \            / \
         /    \          /   \
       12       8       9     11
      /  \     / \     /
     41  100  9   50  13
    /        /
   150      120 
    -------------------------------------
    */
    process.stdout.write("\n Tree 1");
    tree1.print_tree();
    process.stdout.write("\n Tree 2");
    tree2.print_tree();
    process.stdout.write("\n\n Delete Min ");
    tree1.min_element();
    tree1.delete_min();
    /*
    --------------------------
    After Delete min element [2]
    --------------------------

                  3
                 / \ 
                /   \
               /     \
              /       \
             /         \
            /           \
           /             \
          4               6
         / \             / \
        /   \           /   \
       45    5         9     11
      /     / \       / 
     /     /   \     /   
   70    12     8   13     
        /  \   / \
       41 100 9  50
      /      /
    150    120 
    -------------------------------------
    */
    tree1.print_tree();
}
main();

Output

 Preorder :   2  3  6  9  13  11  70  4  45
 Inorder :   13  9  6  11  3  70  2  45  4
 Postorder :   13  9  11  6  70  3  45  4  2

 Preorder :   5  12  41  150  100  8  9  120  50
 Inorder :   150  41  12  100  5  120  9  8  50
 Postorder :   150  41  100  12  120  9  50  8  5

 Merge Two Tree

 Tree 1
 Preorder :   2  4  5  12  41  150  100  8  9  120  50  45  3  6  9  13  11  70
 Inorder :   150  41  12  100  5  120  9  8  50  4  45  2  13  9  6  11  3  70
 Postorder :   150  41  100  12  120  9  50  8  5  45  4  13  9  11  6  70  3  2

 Tree 2
 Empty Tree

 Delete Min
 Min Element : 2

 Preorder :   3  4  45  70  5  12  41  150  100  8  9  120  50  6  9  13  11
 Inorder :   70  45  4  150  41  12  100  5  120  9  8  50  3  13  9  6  11
 Postorder :   70  45  150  41  100  12  120  9  50  8  5  4  13  9  11  6  3
#  Python 3 Program 
#  Implement Skew heap

#  Tree Node
class TreeNode :
	
	def __init__(self, data) :
		self.data = data
		self.left = None
		self.right = None
	

#  SkewHeap 
class SkewHeap :
	
	def __init__(self) :
		self.root = None
	
	# Swap the child of given node
	def swap_child(self, parent) :
		if (parent != None) :
			temp = parent.left
			parent.left = parent.right
			parent.right = temp
		
	
	# Merge nodes of given two SkewHeap tree
	def merge_node(self, n1, n2) :
		if (n1 == None) :
			return n2
		
		if (n2 == None) :
			return n1
		
		if (n1.data < n2.data) :
			temp = n1.right
			n1.right = n1.left
			n1.left = self.merge_node(n2, temp)
			return n1
		else :
			return self.merge_node(n2, n1)
		
	
	#  Handles the request of adding a new node in SkewHeap tree
	def add_node(self, data) :
		node = TreeNode(data)
		self.root = self.merge_node(node, self.root)
	
	def inorder(self, node) :
		if (node != None) :
			self.inorder(node.left)
			# Print node value
			print("  ", node.data, end = "")
			self.inorder(node.right)
		
	
	def preorder(self, node) :
		if (node != None) :
			# Print node value
			print("  ", node.data, end = "")
			self.preorder(node.left)
			self.preorder(node.right)
		
	
	def postorder(self, node) :
		if (node != None) :
			self.postorder(node.left)
			self.postorder(node.right)
			# Print node value
			print("  ", node.data, end = "")
		
	
	#  Handles the request of view tree elements
	def print_tree(self) :
		if (self.root != None) :
			#  Display tree elements
			print("\n Preorder : ", end = "")
			self.preorder(self.root)
			print("\n Inorder : ", end = "")
			self.inorder(self.root)
			print("\n Postorder : ", end = "")
			self.postorder(self.root)
			print("\n", end = "")
		else :
			print("\n Empty Tree", end = "")
		
	
	# Handles the request to merge two trees
	def merge_tree(self, tree2) :
		self.root = self.merge_node(self.root, tree2.root)
		tree2.root = None
	
	def delete_min(self) :
		if (self.root == None) :
			print("\nEmpty Tree\n", end = "")
		else :
			self.root = self.merge_node(self.root.left, self.root.right)
		
	
	# Print Min element of tree
	def min_element(self) :
		if (self.root == None) :
			print("\nEmpty Tree\n", end = "")
		else :
			print("\n Min Element : ", self.root.data ," \n", end = "")
		
	

def main() :
	tree1 = SkewHeap()
	tree2 = SkewHeap()
	#  Added nodes
	tree1.add_node(6)
	tree1.add_node(9)
	tree1.add_node(11)
	tree1.add_node(3)
	tree1.add_node(2)
	tree1.add_node(45)
	tree1.add_node(70)
	tree1.add_node(4)
	tree1.add_node(13)
	# 
	#                   2
	#                 /  \ 
	#                /    \
	#               3      4
	#              / \    / 
	#             6   70 45   
	#            / \
	#           9   11
	#          /
	#         13    
	#         ----------------------------
	#         Constructing Binary Swap heap tree
	#         ----------------------------
	#         
	
	tree1.print_tree()
	#  Put tree nodes
	tree2.add_node(5)
	tree2.add_node(9)
	tree2.add_node(41)
	tree2.add_node(8)
	tree2.add_node(12)
	tree2.add_node(50)
	tree2.add_node(100)
	tree2.add_node(120)
	tree2.add_node(150)
	# 
	#                   5 
	#                 /   \ 
	#                /     \
	#               12      8
	#              / \     /  \
	#             41 100  9   50
	#            /       /
	#          150      120
	#         ----------------------------
	#         Constructing Binary Swap heap tree 
	#         ----------------------------
	#         
	
	tree2.print_tree()
	print("\n Merge Two Tree \n", end = "")
	tree1.merge_tree(tree2)
	# 
	#             After merge two tree
	#                           2
	#                          / \ 
	#                         /   \
	#                        /     \
	#                       /       \
	#                      /         \
	#                     /           \
	#                    /             \
	#                   4               3
	#                  /  \            / \
	#                 /    \          /   \
	#                5     45        6     70
	#               /  \            / \
	#              /    \          /   \
	#            12       8       9     11
	#           /  \     / \     /
	#          41  100  9   50  13
	#         /        /
	#        150      120 
	#         -------------------------------------
	#         
	
	print("\n Tree 1", end = "")
	tree1.print_tree()
	print("\n Tree 2", end = "")
	tree2.print_tree()
	print("\n\n Delete Min ", end = "")
	tree1.min_element()
	tree1.delete_min()
	# 
	#         --------------------------
	#         After Delete min element [2]
	#         --------------------------
	#                       3
	#                      / \ 
	#                     /   \
	#                    /     \
	#                   /       \
	#                  /         \
	#                 /           \
	#                /             \
	#               4               6
	#              / \             / \
	#             /   \           /   \
	#            45    5         9     11
	#           /     / \       / 
	#          /     /   \     /   
	#        70    12     8   13     
	#             /  \   / \
	#            41 100 9  50
	#           /      /
	#         150    120 
	#         -------------------------------------
	#         
	
	tree1.print_tree()

if __name__ == "__main__": main()

Output

 Preorder :    2   3   6   9   13   11   70   4   45
 Inorder :    13   9   6   11   3   70   2   45   4
 Postorder :    13   9   11   6   70   3   45   4   2

 Preorder :    5   12   41   150   100   8   9   120   50
 Inorder :    150   41   12   100   5   120   9   8   50
 Postorder :    150   41   100   12   120   9   50   8   5

 Merge Two Tree

 Tree 1
 Preorder :    2   4   5   12   41   150   100   8   9   120   50   45   3   6   9   13   11   70
 Inorder :    150   41   12   100   5   120   9   8   50   4   45   2   13   9   6   11   3   70
 Postorder :    150   41   100   12   120   9   50   8   5   45   4   13   9   11   6   70   3   2

 Tree 2
 Empty Tree

 Delete Min
 Min Element :  2

 Preorder :    3   4   45   70   5   12   41   150   100   8   9   120   50   6   9   13   11
 Inorder :    70   45   4   150   41   12   100   5   120   9   8   50   3   13   9   6   11
 Postorder :    70   45   150   41   100   12   120   9   50   8   5   4   13   9   11   6   3
#  Ruby Program 
#  Implement Skew heap

#  Tree Node
class TreeNode  
	# Define the accessor and reader of class TreeNode  
	attr_reader :data, :left, :right
	attr_accessor :data, :left, :right
 
	
	def initialize(data) 
		self.data = data
		self.left = nil
		self.right = nil
	end

end

#  SkewHeap 
class SkewHeap  
	# Define the accessor and reader of class SkewHeap  
	attr_reader :root
	attr_accessor :root
 
	
	def initialize() 
		self.root = nil
	end

	# Swap the child of given node
	def swap_child(parent) 
		if (parent != nil) 
			temp = parent.left
			parent.left = parent.right
			parent.right = temp
		end

	end

	# Merge nodes of given two SkewHeap tree
	def merge_node(n1, n2) 
		if (n1 == nil) 
			return n2
		end

		if (n2 == nil) 
			return n1
		end

		if (n1.data < n2.data) 
			temp = n1.right
			n1.right = n1.left
			n1.left = self.merge_node(n2, temp)
			return n1
		else 
			return self.merge_node(n2, n1)
		end

	end

	#  Handles the request of adding a new node in SkewHeap tree
	def add_node(data) 
		node = TreeNode.new(data)
		self.root = self.merge_node(node, self.root)
	end

	def inorder(node) 
		if (node != nil) 
			self.inorder(node.left)
			# Print node value
			print("  ", node.data)
			self.inorder(node.right)
		end

	end

	def preorder(node) 
		if (node != nil) 
			# Print node value
			print("  ", node.data)
			self.preorder(node.left)
			self.preorder(node.right)
		end

	end

	def postorder(node) 
		if (node != nil) 
			self.postorder(node.left)
			self.postorder(node.right)
			# Print node value
			print("  ", node.data)
		end

	end

	#  Handles the request of view tree elements
	def print_tree() 
		if (self.root != nil) 
			#  Display tree elements
			print("\n Preorder : ")
			self.preorder(self.root)
			print("\n Inorder : ")
			self.inorder(self.root)
			print("\n Postorder : ")
			self.postorder(self.root)
			print("\n")
		else 
			print("\n Empty Tree")
		end

	end

	# Handles the request to merge two trees
	def merge_tree(tree2) 
		self.root = self.merge_node(self.root, tree2.root)
		tree2.root = nil
	end

	def delete_min() 
		if (self.root == nil) 
			print("\nEmpty Tree\n")
		else 
			self.root = self.merge_node(self.root.left, self.root.right)
		end

	end

	# Print Min element of tree
	def min_element() 
		if (self.root == nil) 
			print("\nEmpty Tree\n")
		else 
			print("\n Min Element : ", self.root.data ," \n")
		end

	end

end

def main() 
	tree1 = SkewHeap.new()
	tree2 = SkewHeap.new()
	#  Added nodes
	tree1.add_node(6)
	tree1.add_node(9)
	tree1.add_node(11)
	tree1.add_node(3)
	tree1.add_node(2)
	tree1.add_node(45)
	tree1.add_node(70)
	tree1.add_node(4)
	tree1.add_node(13)
	# 
	#                   2
	#                 /  \ 
	#                /    \
	#               3      4
	#              / \    / 
	#             6   70 45   
	#            / \
	#           9   11
	#          /
	#         13    
	#         ----------------------------
	#         Constructing Binary Swap heap tree
	#         ----------------------------
	#         
	
	tree1.print_tree()
	#  Put tree nodes
	tree2.add_node(5)
	tree2.add_node(9)
	tree2.add_node(41)
	tree2.add_node(8)
	tree2.add_node(12)
	tree2.add_node(50)
	tree2.add_node(100)
	tree2.add_node(120)
	tree2.add_node(150)
	# 
	#                   5 
	#                 /   \ 
	#                /     \
	#               12      8
	#              / \     /  \
	#             41 100  9   50
	#            /       /
	#          150      120
	#         ----------------------------
	#         Constructing Binary Swap heap tree 
	#         ----------------------------
	#         
	
	tree2.print_tree()
	print("\n Merge Two Tree \n")
	tree1.merge_tree(tree2)
	# 
	#             After merge two tree
	#                           2
	#                          / \ 
	#                         /   \
	#                        /     \
	#                       /       \
	#                      /         \
	#                     /           \
	#                    /             \
	#                   4               3
	#                  /  \            / \
	#                 /    \          /   \
	#                5     45        6     70
	#               /  \            / \
	#              /    \          /   \
	#            12       8       9     11
	#           /  \     / \     /
	#          41  100  9   50  13
	#         /        /
	#        150      120 
	#         -------------------------------------
	#         
	
	print("\n Tree 1")
	tree1.print_tree()
	print("\n Tree 2")
	tree2.print_tree()
	print("\n\n Delete Min ")
	tree1.min_element()
	tree1.delete_min()
	# 
	#         --------------------------
	#         After Delete min element [2]
	#         --------------------------
	#                       3
	#                      / \ 
	#                     /   \
	#                    /     \
	#                   /       \
	#                  /         \
	#                 /           \
	#                /             \
	#               4               6
	#              / \             / \
	#             /   \           /   \
	#            45    5         9     11
	#           /     / \       / 
	#          /     /   \     /   
	#        70    12     8   13     
	#             /  \   / \
	#            41 100 9  50
	#           /      /
	#         150    120 
	#         -------------------------------------
	#         
	
	tree1.print_tree()
end

main()

Output

 Preorder :   2  3  6  9  13  11  70  4  45
 Inorder :   13  9  6  11  3  70  2  45  4
 Postorder :   13  9  11  6  70  3  45  4  2

 Preorder :   5  12  41  150  100  8  9  120  50
 Inorder :   150  41  12  100  5  120  9  8  50
 Postorder :   150  41  100  12  120  9  50  8  5

 Merge Two Tree 

 Tree 1
 Preorder :   2  4  5  12  41  150  100  8  9  120  50  45  3  6  9  13  11  70
 Inorder :   150  41  12  100  5  120  9  8  50  4  45  2  13  9  6  11  3  70
 Postorder :   150  41  100  12  120  9  50  8  5  45  4  13  9  11  6  70  3  2

 Tree 2
 Empty Tree

 Delete Min 
 Min Element : 2 

 Preorder :   3  4  45  70  5  12  41  150  100  8  9  120  50  6  9  13  11
 Inorder :   70  45  4  150  41  12  100  5  120  9  8  50  3  13  9  6  11
 Postorder :   70  45  150  41  100  12  120  9  50  8  5  4  13  9  11  6  3
/*
    Scala Program 
    Implement Skew heap
*/

//  Tree Node
class TreeNode(var data: Int , var left: TreeNode , var right: TreeNode)
{
    def this(data: Int)
    {
        this(data, null, null);
    }
}
//  SkewHeap
class SkewHeap(var root: TreeNode)
{
    def this()
    {
        this(null);
    }
    // Swap the child of given node
    def swap_child(parent: TreeNode): Unit = {
        if (parent != null)
        {
            var temp: TreeNode = parent.left;
            parent.left = parent.right;
            parent.right = temp;
        }
    }
    // Merge nodes of given two SkewHeap tree
    def merge_node(n1: TreeNode, n2: TreeNode): TreeNode = {
        if (n1 == null)
        {
            return n2;
        }
        if (n2 == null)
        {
            return n1;
        }
        if (n1.data < n2.data)
        {
            var temp: TreeNode = n1.right;
            n1.right = n1.left;
            n1.left = merge_node(n2, temp);
            return n1;
        }
        else
        {
            return merge_node(n2, n1);
        }
    }
    //  Handles the request of adding a new node in SkewHeap tree
    def add_node(data: Int): Unit = {
        var node: TreeNode = new TreeNode(data);
        this.root = merge_node(node, this.root);
    }
    def inorder(node: TreeNode): Unit = {
        if (node != null)
        {
            inorder(node.left);
            // Print node value
            print("  " + node.data);
            inorder(node.right);
        }
    }
    def preorder(node: TreeNode): Unit = {
        if (node != null)
        {
            // Print node value
            print("  " + node.data);
            preorder(node.left);
            preorder(node.right);
        }
    }
    def postorder(node: TreeNode): Unit = {
        if (node != null)
        {
            postorder(node.left);
            postorder(node.right);
            // Print node value
            print("  " + node.data);
        }
    }
    //  Handles the request of view tree elements
    def print_tree(): Unit = {
        if (this.root != null)
        {
            //  Display tree elements
            print("\n Preorder : ");
            preorder(this.root);
            print("\n Inorder : ");
            inorder(this.root);
            print("\n Postorder : ");
            postorder(this.root);
            print("\n");
        }
        else
        {
            print("\n Empty Tree");
        }
    }
    // Handles the request to merge two trees
    def merge_tree(tree2: SkewHeap): Unit = {
        this.root = merge_node(this.root, tree2.root);
        tree2.root = null;
    }
    def delete_min(): Unit = {
        if (this.root == null)
        {
            print("\nEmpty Tree\n");
        }
        else
        {
            this.root = merge_node(this.root.left, this.root.right);
        }
    }
    // Print Min element of tree
    def min_element(): Unit = {
        if (this.root == null)
        {
            print("\nEmpty Tree\n");
        }
        else
        {
            print("\n Min Element : " + this.root.data + " \n");
        }
    }
}
object Main
{
    def main(args: Array[String]): Unit = {
        var tree1: SkewHeap = new SkewHeap();
        var tree2: SkewHeap = new SkewHeap();
        //  Added nodes
        tree1.add_node(6);
        tree1.add_node(9);
        tree1.add_node(11);
        tree1.add_node(3);
        tree1.add_node(2);
        tree1.add_node(45);
        tree1.add_node(70);
        tree1.add_node(4);
        tree1.add_node(13);
        /*
                      2
                    /  \ 
                   /    \
                  3      4
                 / \    / 
                6   70 45   
               / \
              9   11
             /
            13    
            ----------------------------
            Constructing Binary Swap heap tree
            ----------------------------
        */
        tree1.print_tree();
        //  Put tree nodes
        tree2.add_node(5);
        tree2.add_node(9);
        tree2.add_node(41);
        tree2.add_node(8);
        tree2.add_node(12);
        tree2.add_node(50);
        tree2.add_node(100);
        tree2.add_node(120);
        tree2.add_node(150);
        /*

                      5 
                    /   \ 
                   /     \
                  12      8
                 / \     /  \
                41 100  9   50
               /       /
             150      120
            ----------------------------
            Constructing Binary Swap heap tree 
            ----------------------------
        */
        tree2.print_tree();
        print("\n Merge Two Tree \n");
        tree1.merge_tree(tree2);
        /*
        After merge two tree

                          2
                         / \ 
                        /   \
                       /     \
                      /       \
                     /         \
                    /           \
                   /             \
                  4               3
                 /  \            / \
                /    \          /   \
               5     45        6     70
              /  \            / \
             /    \          /   \
           12       8       9     11
          /  \     / \     /
         41  100  9   50  13
        /        /
       150      120 
        -------------------------------------
        */
        print("\n Tree 1");
        tree1.print_tree();
        print("\n Tree 2");
        tree2.print_tree();
        print("\n\n Delete Min ");
        tree1.min_element();
        tree1.delete_min();
        /*
            --------------------------
            After Delete min element [2]
            --------------------------

                          3
                         / \ 
                        /   \
                       /     \
                      /       \
                     /         \
                    /           \
                   /             \
                  4               6
                 / \             / \
                /   \           /   \
               45    5         9     11
              /     / \       / 
             /     /   \     /   
           70    12     8   13     
                /  \   / \
               41 100 9  50
              /      /
            150    120 
        -------------------------------------
        */
        tree1.print_tree();
    }
}

Output

 Preorder :   2  3  6  9  13  11  70  4  45
 Inorder :   13  9  6  11  3  70  2  45  4
 Postorder :   13  9  11  6  70  3  45  4  2

 Preorder :   5  12  41  150  100  8  9  120  50
 Inorder :   150  41  12  100  5  120  9  8  50
 Postorder :   150  41  100  12  120  9  50  8  5

 Merge Two Tree

 Tree 1
 Preorder :   2  4  5  12  41  150  100  8  9  120  50  45  3  6  9  13  11  70
 Inorder :   150  41  12  100  5  120  9  8  50  4  45  2  13  9  6  11  3  70
 Postorder :   150  41  100  12  120  9  50  8  5  45  4  13  9  11  6  70  3  2

 Tree 2
 Empty Tree

 Delete Min
 Min Element : 2

 Preorder :   3  4  45  70  5  12  41  150  100  8  9  120  50  6  9  13  11
 Inorder :   70  45  4  150  41  12  100  5  120  9  8  50  3  13  9  6  11
 Postorder :   70  45  150  41  100  12  120  9  50  8  5  4  13  9  11  6  3
/*
    Swift 4 Program 
    Implement Skew heap
*/
//  Tree Node
class TreeNode
{
    var data: Int;
    var left: TreeNode? ;
    var right: TreeNode? ;
    init(_ data: Int)
    {
        self.data = data;
        self.left = nil;
        self.right = nil;
    }
}
//  SkewHeap
class SkewHeap
{
    var root: TreeNode? ;
    init()
    {
        self.root = nil;
    }
    // Swap the child of given node
    func swap_child(_ parent: TreeNode? )
    {
        if (parent != nil)
        {
            let temp: TreeNode? = parent!.left;
            parent!.left = parent!.right;
            parent!.right = temp;
        }
    }
    // Merge nodes of given two SkewHeap tree
    func merge_node(_ n1: TreeNode? , _ n2 : TreeNode? )->TreeNode?
    {
        if (n1 == nil)
        {
            return n2;
        }
        if (n2 == nil)
        {
            return n1;
        }
        if (n1!.data < n2!.data)
        {
            let temp: TreeNode? = n1!.right;
            n1!.right = n1!.left;
            n1!.left = self.merge_node(n2, temp);
            return n1;
        }
        else
        {
            return self.merge_node(n2, n1);
        }
    }
    //  Handles the request of adding a new node in SkewHeap tree
    func add_node(_ data: Int)
    {
        let node: TreeNode? = TreeNode(data);
        self.root = self.merge_node(node, self.root);
    }
    func inorder(_ node: TreeNode? )
    {
        if (node != nil)
        {
            self.inorder(node!.left);
            // Print node value
            print("  ", node!.data, terminator: "");
            self.inorder(node!.right);
        }
    }
    func preorder(_ node: TreeNode? )
    {
        if (node != nil)
        {
            // Print node value
            print("  ", node!.data, terminator: "");
            self.preorder(node!.left);
            self.preorder(node!.right);
        }
    }
    func postorder(_ node: TreeNode? )
    {
        if (node != nil)
        {
            self.postorder(node!.left);
            self.postorder(node!.right);
            // Print node value
            print("  ", node!.data, terminator: "");
        }
    }
    //  Handles the request of view tree elements
    func print_tree()
    {
        if (self.root != nil)
        {
            //  Display tree elements
            print("\n Preorder : ", terminator: "");
            self.preorder(self.root);
            print("\n Inorder : ", terminator: "");
            self.inorder(self.root);
            print("\n Postorder : ", terminator: "");
            self.postorder(self.root);
            print("\n", terminator: "");
        }
        else
        {
            print("\n Empty Tree", terminator: "");
        }
    }
    // Handles the request to merge two trees
    func merge_tree(_ tree2: SkewHeap? )
    {
        self.root = self.merge_node(self.root, tree2!.root);
        tree2!.root = nil;
    }
    func delete_min()
    {
        if (self.root == nil)
        {
            print("\nEmpty Tree\n", terminator: "");
        }
        else
        {
            self.root = self.merge_node(self.root!.left, self.root!.right);
        }
    }
    // Print Min element of tree
    func min_element()
    {
        if (self.root == nil)
        {
            print("\nEmpty Tree\n", terminator: "");
        }
        else
        {
            print("\n Min Element : ", self.root!.data ," \n", terminator: "");
        }
    }
}
func main()
{
    let tree1: SkewHeap = SkewHeap();
    let tree2: SkewHeap = SkewHeap();
    //  Added nodes
    tree1.add_node(6);
    tree1.add_node(9);
    tree1.add_node(11);
    tree1.add_node(3);
    tree1.add_node(2);
    tree1.add_node(45);
    tree1.add_node(70);
    tree1.add_node(4);
    tree1.add_node(13);
    /*
                 2
               /  \ 
              /    \
             3      4
            / \    / 
           6   70 45   
          / \
         9   11
        /
       13    
       ----------------------------
       Constructing Binary Swap heap tree
       ----------------------------
    */
    tree1.print_tree();
    //  Put tree nodes
    tree2.add_node(5);
    tree2.add_node(9);
    tree2.add_node(41);
    tree2.add_node(8);
    tree2.add_node(12);
    tree2.add_node(50);
    tree2.add_node(100);
    tree2.add_node(120);
    tree2.add_node(150);
    /*

                 5 
               /   \ 
              /     \
             12      8
            / \     /  \
           41 100  9   50
          /       /
        150      120
    --------------------------------------
       Constructing Binary Swap heap tree 
    --------------------------------------
    */
    tree2.print_tree();
    print("\n Merge Two Tree \n", terminator: "");
    tree1.merge_tree(tree2);
    /*
           After merge two tree

                         2
                        / \ 
                       /   \
                      /     \
                     /       \
                    /         \
                   /           \
                  /             \
                 4               3
                /  \            / \
               /    \          /   \
              5     45        6     70
             /  \            / \
            /    \          /   \
          12       8       9     11
         /  \     / \     /
        41  100  9   50  13
       /        /
      150      120 
    -------------------------------------
    */
    print("\n Tree 1", terminator: "");
    tree1.print_tree();
    print("\n Tree 2", terminator: "");
    tree2.print_tree();
    print("\n\n Delete Min ", terminator: "");
    tree1.min_element();
    tree1.delete_min();
    /*
   --------------------------
   After Delete min element [2]
   --------------------------

                     3
                    / \ 
                   /   \
                  /     \
                 /       \
                /         \
               /           \
              /             \
             4               6
            / \             / \
           /   \           /   \
          45    5         9     11
         /     / \       / 
        /     /   \     /   
      70    12     8   13     
           /  \   / \
          41 100 9  50
         /      /
       150    120 
   -------------------------------------
   */
    tree1.print_tree();
}
main();

Output

 Preorder :    2   3   6   9   13   11   70   4   45
 Inorder :    13   9   6   11   3   70   2   45   4
 Postorder :    13   9   11   6   70   3   45   4   2

 Preorder :    5   12   41   150   100   8   9   120   50
 Inorder :    150   41   12   100   5   120   9   8   50
 Postorder :    150   41   100   12   120   9   50   8   5

 Merge Two Tree

 Tree 1
 Preorder :    2   4   5   12   41   150   100   8   9   120   50   45   3   6   9   13   11   70
 Inorder :    150   41   12   100   5   120   9   8   50   4   45   2   13   9   6   11   3   70
 Postorder :    150   41   100   12   120   9   50   8   5   45   4   13   9   11   6   70   3   2

 Tree 2
 Empty Tree

 Delete Min
 Min Element :  2

 Preorder :    3   4   45   70   5   12   41   150   100   8   9   120   50   6   9   13   11
 Inorder :    70   45   4   150   41   12   100   5   120   9   8   50   3   13   9   6   11
 Postorder :    70   45   150   41   100   12   120   9   50   8   5   4   13   9   11   6   3




Comment

Please share your knowledge to improve code and content standard. Also submit your doubts, and test case. We improve by your feedback. We will try to resolve your query as soon as possible.

New Comment