Skip to main content

Construct BST from given preorder traversal using stack

Here given code implementation process.

/*
    C Program 
    Construct BST from given preorder traversal using stack
*/
#include <stdio.h>
#include <stdlib.h>

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

// Binary Search Tree
struct BinarySearchTree
{
    struct TreeNode *root;
};

// Define stack node
struct StackNode
{
    struct TreeNode * element;
    struct StackNode *next;
};
// Define a custom stack
struct MyStack
{
    struct StackNode *top;
    int size;
};

struct MyStack *newStack()
{
    //Make a stack
    struct MyStack *stack = (struct MyStack *) malloc(sizeof(struct MyStack));
    if (stack != NULL)
    {
        //Set node values
        stack->top = NULL;
        stack->size = 0;
    }
    else
    {
        printf("\nMemory overflow when create new stack\n");
    }
}
// Returns the status of empty or non empty stacks
int isEmpty(struct MyStack *stack)
{
    if (stack->size > 0 && stack->top != NULL)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}
// Add node at the top of stack
void push(struct MyStack *stack, struct TreeNode* element)
{

    // Make a new node
    struct StackNode *node = (struct StackNode *) malloc(sizeof(struct StackNode));
    if (node == NULL)
    {
        printf("\nMemory overflow when create new stack Node \n");
    }
    else
    {
        node->element = element;
        node->next    = stack->top;
    }

    // Add stack element
    stack->top = node;
    stack->size++;
}
// return top element of stack
struct TreeNode * peek(struct MyStack *stack)
{
    if(stack->top == NULL)
    {
        return NULL;
    }
    return stack->top->element;
}
// Remove top element of stack
void pop(struct MyStack *stack)
{
    if (isEmpty(stack) == 0)
    {
        struct StackNode *temp = stack->top;
        // Change top element of stack
        stack->top = temp->next;
        // remove previous top
        free(temp);
        temp = NULL;
        stack->size--;
    }
}

// Create new tree
struct BinarySearchTree *newTree()
{
    // Create dynamic node
    struct BinarySearchTree *tree = (struct BinarySearchTree *) malloc(sizeof(struct BinarySearchTree));

    if (tree != NULL)
    {
        tree->root = NULL;
    }
    else
    {
        printf("Memory Overflow to Create tree Tree\n");
    }
    // return new tree
    return tree;
}
// returns a new node of tree
struct TreeNode *newTreeNode(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;
}
// Handle request to construct bst using given preorder sequence
struct BinarySearchTree *makeTree(int preorder[],int n)
{
    if(n <= 0)
    {
        return NULL;
    }
    // Create an empty tree
    struct BinarySearchTree *tree = newTree();

    // Create an empty stack
    struct MyStack* st = newStack();

    // Create first node of tree
    struct TreeNode* node = newTreeNode(preorder[0]);

    // Add first element into stack
    push(st,node);

    tree->root = node;

    int i = 1;

    while(i < n)
    {
        
        node = NULL;
        // Find new inserted node position
        while(isEmpty(st)==0 && peek(st)->data < preorder[i] )
        {
            // Get the  top element of stack
            node =  peek(st);
            // Remove top element of stack
            pop(st);
        }

        if(node!=NULL)
        {
            // Add node in right subtree
            node->right = newTreeNode(preorder[i]);
            //  Add stack element
            push(st,node->right);
        }
        else
        {
            // Get the  top element of stack
            node = peek(st); 

            // Add node in left subtree
            node->left = newTreeNode(preorder[i]);
            //  Add stack element
            push(st,node->left);
        }

        i++;
    }

    return tree;
}


//Display inorder elements
void printInorder(struct TreeNode *node)
{
    if (node != NULL)
    {
        printInorder(node->left);
        //Print node value
        printf("  %d", node->data);
        printInorder(node->right);
    }
}
//Display pre order elements
void printPreorder(struct TreeNode *node)
{
    if (node != NULL)
    {
        //Print node value
        printf("  %d", node->data);
        printPreorder(node->left);
        printPreorder(node->right);
    }
}
//Display postorder elements
void printPostorder(struct TreeNode *node)
{
    if (node != NULL)
    {
        printPostorder(node->left);
        printPostorder(node->right);
        //Print node value
        printf("  %d", node->data);
    }
}
//Handles the request of display the element of tree 
void printTree(struct TreeNode *root)
{
    if (root == NULL)
    {
        return;
    }
    // Display tree elements in three formats
    printf("\n Preorder : ");
    printPreorder(root);
    printf("\n Inorder : ");
    printInorder(root);
    printf("\n Postorder : ");
    printPostorder(root);
    printf("\n");
}
int main()
{   
    int preorder[] = {15,13,12,11,14,20,19,17,18,21,22};

    int n = sizeof(preorder)/sizeof(preorder[0]);

    struct BinarySearchTree *tree = makeTree(preorder, n);
    /*
                15
             /     \
            13      20
           /  \     / \
          12  14   19  21
         /        /      \
        11       17       22
                  \
                   18
        -----------------------
        Built binary search tree         
    */  
    printTree(tree->root);
   
    
    return 0;
}

Output

 Preorder :   15  13  12  11  14  20  19  17  18  21  22
 Inorder :   11  12  13  14  15  17  18  19  20  21  22
 Postorder :   11  12  14  13  18  17  19  22  21  20  15
/*
   Java Program for
   Construct BST from given preorder traversal using stack
*/
class TreeNode
{
    public int data;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(int data)
    {
        this.data = data;
        this.left = null;
        this.right = null;
    }
}
// Define stack node
class StackNode
{
    public TreeNode element;
    public StackNode next;
    public StackNode(TreeNode element, StackNode top)
    {
        this.element = element;
        this.next = top;
    }
}
// Define a custom stack
class MyStack
{
    public StackNode top;
    public int size;
    public MyStack()
    {
        //Set node values
        this.top = null;
        this.size = 0;
    }
    // Add node at the top of stack
    public void push(TreeNode element)
    {
        this.top = new StackNode(element, this.top);
        this.size++;
    }
    public boolean isEmpty()
    {
        if (this.size > 0 && this.top != null)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    // Remove top element of stack
    public void pop()
    {
        if (this.size > 0 && this.top != null)
        {
            StackNode temp = this.top;
            // Change top element of stack
            this.top = temp.next;
            // remove previous top
            temp = null;
            this.size--;
        }
    }
    // return top element of stack
    public TreeNode peek()
    {
        if (this.top == null)
        {
            return null;
        }
        return this.top.element;
    }
}
class BinarySearchTree
{
    public TreeNode root;
    public BinarySearchTree()
    {
        this.root = null;
    }
    //Display inorder elements
    public void printInorder(TreeNode node)
    {
        if (node != null)
        {
            printInorder(node.left);
            //Print node value
            System.out.print(" " + node.data);
            printInorder(node.right);
        }
    }
    //Display pre order elements
    public void printPreorder(TreeNode node)
    {
        if (node != null)
        {
            //Print node value
            System.out.print(" " + node.data);
            printPreorder(node.left);
            printPreorder(node.right);
        }
    }
    //Display postorder elements
    public void printPostorder(TreeNode node)
    {
        if (node != null)
        {
            printPostorder(node.left);
            printPostorder(node.right);
            //Print node value
            System.out.print(" " + node.data);
        }
    }
    //Handles the request of display the element of tree 
    public void printTree()
    {
        if (this.root == null)
        {
            return;
        }
        // Display tree elements in three formats
        System.out.print("\n Preorder :");
        printPreorder(this.root);
        System.out.print("\n Inorder :");
        printInorder(this.root);
        System.out.print("\n Postorder :");
        printPostorder(this.root);
        System.out.print("\n");
    }

   
}
public class Construct
{

    // Handle request to construct bst using given preorder sequence
    public BinarySearchTree makeTree(int[] preorder, int n)
    {
        if (n <= 0)
        {
            return null;
        }
        // Create an empty tree
        BinarySearchTree tree = new BinarySearchTree();
        // Create an empty stack
        MyStack st = new MyStack();
        // Create first node of tree
        TreeNode node = new TreeNode(preorder[0]);
        // Add first element into stack
        st.push(node);
        tree.root = node;
        int i = 1;
        while (i < n)
        {
            node = null;
            // Find new inserted node position
            while (st.isEmpty() == false && st.peek().data < preorder[i])
            {
                // Get the  top element of stack
                node = st.peek();
                // Remove top element of stack
                st.pop();
            }
            if (node != null)
            {
                // Add node in right subtree
                node.right = new TreeNode(preorder[i]);
                //  Add stack element
                st.push(node.right);
            }
            else
            {
                // Get the  top element of stack
                node = st.peek();
                // Add node in left subtree
                node.left = new TreeNode(preorder[i]);
                //  Add stack element
                st.push(node.left);
            }
            i++;
        }
        return tree;
    }
    public static void main(String[] args)
    {

        int[] preorder = {
            15 , 13 , 12 , 11 , 14 , 20 , 19 , 17 , 18 , 21 , 22
        };
        int n = preorder.length;
        Construct task = new Construct();

        BinarySearchTree tree = task.makeTree(preorder, n);

        /*
                    15
                 /     \
                13      20
               /  \     / \
              12  14   19  21
             /        /      \
            11       17       22
                      \
                       18
            -----------------------
            Built binary search tree         
        */
        tree.printTree();
    }
}

Output

 Preorder : 15 13 12 11 14 20 19 17 18 21 22
 Inorder : 11 12 13 14 15 17 18 19 20 21 22
 Postorder : 11 12 14 13 18 17 19 22 21 20 15
// Include header file
#include <iostream>

using namespace std;
/*
   C++ Program for
   Construct BST from given preorder traversal using stack
*/
class TreeNode
{
	public: int data;
	TreeNode *left;
	TreeNode *right;
	TreeNode(int data)
	{
		this->data = data;
		this->left = NULL;
		this->right = NULL;
	}
};
// Define stack node
class StackNode
{
	public: TreeNode *element;
	StackNode *next;
	StackNode(TreeNode *element, StackNode *top)
	{
		this->element = element;
		this->next = top;
	}
};
// Define a custom stack
class MyStack
{
	public: StackNode *top;
	int size;
	MyStack()
	{
		//Set node values
		this->top = NULL;
		this->size = 0;
	}
	// Add node at the top of stack
	void push(TreeNode *element)
	{
		this->top = new StackNode(element, this->top);
		this->size++;
	}
	bool isEmpty()
	{
		if (this->size > 0 && this->top != NULL)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	// Remove top element of stack
	void pop()
	{
		if (this->size > 0 && this->top != NULL)
		{
			StackNode *temp = this->top;
			// Change top element of stack
			this->top = temp->next;
			// remove previous top
			temp = NULL;
			this->size--;
		}
	}
	// return top element of stack
	TreeNode *peek()
	{
		if (this->top == NULL)
		{
			return NULL;
		}
		return this->top->element;
	}
};
class BinarySearchTree
{
	public: TreeNode *root;
	BinarySearchTree()
	{
		this->root = NULL;
	}
	//Display inorder elements
	void printInorder(TreeNode *node)
	{
		if (node != NULL)
		{
			this->printInorder(node->left);
			//Print node value
			cout << " " << node->data;
			this->printInorder(node->right);
		}
	}
	//Display pre order elements
	void printPreorder(TreeNode *node)
	{
		if (node != NULL)
		{
			//Print node value
			cout << " " << node->data;
			this->printPreorder(node->left);
			this->printPreorder(node->right);
		}
	}
	//Display postorder elements
	void printPostorder(TreeNode *node)
	{
		if (node != NULL)
		{
			this->printPostorder(node->left);
			this->printPostorder(node->right);
			//Print node value
			cout << " " << node->data;
		}
	}
	//Handles the request of display the element of tree
	void printTree()
	{
		if (this->root == NULL)
		{
			return;
		}
		// Display tree elements in three formats
		cout << "\n Preorder :";
		this->printPreorder(this->root);
		cout << "\n Inorder :";
		this->printInorder(this->root);
		cout << "\n Postorder :";
		this->printPostorder(this->root);
		cout << "\n";
	}
};
class Construct
{
	public:
		// Handle request to construct bst using given preorder sequence
		BinarySearchTree *makeTree(int preorder[], int n)
		{
			if (n <= 0)
			{
				return NULL;
			}
			// Create an empty tree
			BinarySearchTree *tree = new BinarySearchTree();
			// Create an empty stack
			MyStack st = MyStack();
			// Create first node of tree
			TreeNode *node = new TreeNode(preorder[0]);
			// Add first element into stack
			st.push(node);
			tree->root = node;
			int i = 1;
			while (i < n)
			{
				node = NULL;
				// Find new inserted node position
				while (st.isEmpty() == false && st.peek()->data < preorder[i])
				{
					// Get the  top element of stack
					node = st.peek();
					// Remove top element of stack
					st.pop();
				}
				if (node != NULL)
				{
					// Add node in right subtree
					node->right = new TreeNode(preorder[i]);
					//  Add stack element
					st.push(node->right);
				}
				else
				{
					// Get the  top element of stack
					node = st.peek();
					// Add node in left subtree
					node->left = new TreeNode(preorder[i]);
					//  Add stack element
					st.push(node->left);
				}
				i++;
			}
			return tree;
		}
};
int main()
{
	int preorder[] = {
		15 , 13 , 12 , 11 , 14 , 20 , 19 , 17 , 18 , 21 , 22
	};
	int n = sizeof(preorder) / sizeof(preorder[0]);
	Construct task = Construct();
	BinarySearchTree *tree = task.makeTree(preorder, n);
	/*
	            15
	         /     \
	        13      20
	       /  \     / \
	      12  14   19  21
	     /        /      \
	    11       17       22
	              \
	               18
	    -----------------------
	    Built binary search tree         
	*/
	tree->printTree();
	return 0;
}

Output

 Preorder : 15 13 12 11 14 20 19 17 18 21 22
 Inorder : 11 12 13 14 15 17 18 19 20 21 22
 Postorder : 11 12 14 13 18 17 19 22 21 20 15
// Include namespace system
using System;
/*
   C# Program for
   Construct BST from given preorder traversal using stack
*/
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;
	}
}
// Define stack node
public class StackNode
{
	public TreeNode element;
	public StackNode next;
	public StackNode(TreeNode element, StackNode top)
	{
		this.element = element;
		this.next = top;
	}
}
// Define a custom stack
public class MyStack
{
	public StackNode top;
	public int size;
	public MyStack()
	{
		//Set node values
		this.top = null;
		this.size = 0;
	}
	// Add node at the top of stack
	public void push(TreeNode element)
	{
		this.top = new StackNode(element, this.top);
		this.size++;
	}
	public Boolean isEmpty()
	{
		if (this.size > 0 && this.top != null)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	// Remove top element of stack
	public void pop()
	{
		if (this.size > 0 && this.top != null)
		{
			StackNode temp = this.top;
			// Change top element of stack
			this.top = temp.next;
			// remove previous top
			temp = null;
			this.size--;
		}
	}
	// return top element of stack
	public TreeNode peek()
	{
		if (this.top == null)
		{
			return null;
		}
		return this.top.element;
	}
}
public class BinarySearchTree
{
	public TreeNode root;
	public BinarySearchTree()
	{
		this.root = null;
	}
	//Display inorder elements
	public void printInorder(TreeNode node)
	{
		if (node != null)
		{
			printInorder(node.left);
			//Print node value
			Console.Write(" " + node.data);
			printInorder(node.right);
		}
	}
	//Display pre order elements
	public void printPreorder(TreeNode node)
	{
		if (node != null)
		{
			//Print node value
			Console.Write(" " + node.data);
			printPreorder(node.left);
			printPreorder(node.right);
		}
	}
	//Display postorder elements
	public void printPostorder(TreeNode node)
	{
		if (node != null)
		{
			printPostorder(node.left);
			printPostorder(node.right);
			//Print node value
			Console.Write(" " + node.data);
		}
	}
	//Handles the request of display the element of tree
	public void printTree()
	{
		if (this.root == null)
		{
			return;
		}
		// Display tree elements in three formats
		Console.Write("\n Preorder :");
		printPreorder(this.root);
		Console.Write("\n Inorder :");
		printInorder(this.root);
		Console.Write("\n Postorder :");
		printPostorder(this.root);
		Console.Write("\n");
	}
}
public class Construct
{
	// Handle request to construct bst using given preorder sequence
	public BinarySearchTree makeTree(int[] preorder, int n)
	{
		if (n <= 0)
		{
			return null;
		}
		// Create an empty tree
		BinarySearchTree tree = new BinarySearchTree();
		// Create an empty stack
		MyStack st = new MyStack();
		// Create first node of tree
		TreeNode node = new TreeNode(preorder[0]);
		// Add first element into stack
		st.push(node);
		tree.root = node;
		int i = 1;
		while (i < n)
		{
			node = null;
			// Find new inserted node position
			while (st.isEmpty() == false && st.peek().data < preorder[i])
			{
				// Get the  top element of stack
				node = st.peek();
				// Remove top element of stack
				st.pop();
			}
			if (node != null)
			{
				// Add node in right subtree
				node.right = new TreeNode(preorder[i]);
				//  Add stack element
				st.push(node.right);
			}
			else
			{
				// Get the  top element of stack
				node = st.peek();
				// Add node in left subtree
				node.left = new TreeNode(preorder[i]);
				//  Add stack element
				st.push(node.left);
			}
			i++;
		}
		return tree;
	}
	public static void Main(String[] args)
	{
		int[] preorder = {
			15 , 13 , 12 , 11 , 14 , 20 , 19 , 17 , 18 , 21 , 22
		};
		int n = preorder.Length;
		Construct task = new Construct();
		BinarySearchTree tree = task.makeTree(preorder, n);
		/*
		            15
		         /     \
		        13      20
		       /  \     / \
		      12  14   19  21
		     /        /      \
		    11       17       22
		              \
		               18
		    -----------------------
		    Built binary search tree         
		*/
		tree.printTree();
	}
}

Output

 Preorder : 15 13 12 11 14 20 19 17 18 21 22
 Inorder : 11 12 13 14 15 17 18 19 20 21 22
 Postorder : 11 12 14 13 18 17 19 22 21 20 15
<?php
/*
   Php Program for
   Construct BST from given preorder traversal using stack
*/
class TreeNode
{
	public $data;
	public $left;
	public $right;

	function __construct($data)
	{
		$this->data = $data;
		$this->left = null;
		$this->right = null;
	}
}
// Define stack node
class StackNode
{
	public $element;
	public $next;

	function __construct($element, $top)
	{
		$this->element = $element;
		$this->next = $top;
	}
}
// Define a custom stack
class MyStack
{
	public $top;
	public $size;

	function __construct()
	{
		//Set node values
		$this->top = null;
		$this->size = 0;
	}
	// Add node at the top of stack
	public	function push($element)
	{
		$this->top = new StackNode($element, $this->top);
		$this->size++;
	}
	public	function isEmpty()
	{
		if ($this->size > 0 && $this->top != null)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	// Remove top element of stack
	public	function pop()
	{
		if ($this->size > 0 && $this->top != null)
		{
			$temp = $this->top;
			// Change top element of stack
			$this->top = $temp->next;
			// remove previous top
			$temp = null;
			$this->size--;
		}
	}
	// return top element of stack
	public	function peek()
	{
		if ($this->top == null)
		{
			return null;
		}
		return $this->top->element;
	}
}
class BinarySearchTree
{
	public $root;

	function __construct()
	{
		$this->root = null;
	}
	//Display inorder elements
	public	function printInorder($node)
	{
		if ($node != null)
		{
			$this->printInorder($node->left);
			//Print node value
			echo " ". $node->data;
			$this->printInorder($node->right);
		}
	}
	//Display pre order elements
	public	function printPreorder($node)
	{
		if ($node != null)
		{
			//Print node value
			echo " ". $node->data;
			$this->printPreorder($node->left);
			$this->printPreorder($node->right);
		}
	}
	//Display postorder elements
	public	function printPostorder($node)
	{
		if ($node != null)
		{
			$this->printPostorder($node->left);
			$this->printPostorder($node->right);
			//Print node value
			echo " ". $node->data;
		}
	}
	//Handles the request of display the element of tree
	public	function printTree()
	{
		if ($this->root == null)
		{
			return;
		}
		// Display tree elements in three formats
		echo "\n Preorder :";
		$this->printPreorder($this->root);
		echo "\n Inorder :";
		$this->printInorder($this->root);
		echo "\n Postorder :";
		$this->printPostorder($this->root);
		echo "\n";
	}
}
class Construct
{
	// Handle request to construct bst using given preorder sequence
	public	function makeTree( & $preorder, $n)
	{
		if ($n <= 0)
		{
			return null;
		}
		// Create an empty tree
		$tree = new BinarySearchTree();
		// Create an empty stack
		$st = new MyStack();
		// Create first node of tree
		$node = new TreeNode($preorder[0]);
		// Add first element into stack
		$st->push($node);
		$tree->root = $node;
		$i = 1;
		while ($i < $n)
		{
			$node = null;
			// Find new inserted node position
			while ($st->isEmpty() == false && $st->peek()->data < $preorder[$i])
			{
				// Get the  top element of stack
				$node = $st->peek();
				// Remove top element of stack
				$st->pop();
			}
			if ($node != null)
			{
				// Add node in right subtree
				$node->right = new TreeNode($preorder[$i]);
				//  Add stack element
				$st->push($node->right);
			}
			else
			{
				// Get the  top element of stack
				$node = $st->peek();
				// Add node in left subtree
				$node->left = new TreeNode($preorder[$i]);
				//  Add stack element
				$st->push($node->left);
			}
			$i++;
		}
		return $tree;
	}
}

function main()
{
	$preorder = array(15, 13, 12, 11, 14, 20, 19, 17, 18, 21, 22);
	$n = count($preorder);
	$task = new Construct();
	$tree = $task->makeTree($preorder, $n);
	/*
	            15
	         /     \
	        13      20
	       /  \     / \
	      12  14   19  21
	     /        /      \
	    11       17       22
	              \
	               18
	    -----------------------
	    Built binary search tree         
	*/
	$tree->printTree();
}
main();

Output

 Preorder : 15 13 12 11 14 20 19 17 18 21 22
 Inorder : 11 12 13 14 15 17 18 19 20 21 22
 Postorder : 11 12 14 13 18 17 19 22 21 20 15
/*
   Node Js Program for
   Construct BST from given preorder traversal using stack
*/
class TreeNode
{
	constructor(data)
	{
		this.data = data;
		this.left = null;
		this.right = null;
	}
}
// Define stack node
class StackNode
{
	constructor(element, top)
	{
		this.element = element;
		this.next = top;
	}
}
// Define a custom stack
class MyStack
{
	constructor()
	{
		//Set node values
		this.top = null;
		this.size = 0;
	}
	// Add node at the top of stack
	push(element)
	{
		this.top = new StackNode(element, this.top);
		this.size++;
	}
	isEmpty()
	{
		if (this.size > 0 && this.top != null)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	// Remove top element of stack
	pop()
	{
		if (this.size > 0 && this.top != null)
		{
			var temp = this.top;
			// Change top element of stack
			this.top = temp.next;
			// remove previous top
			temp = null;
			this.size--;
		}
	}
	// return top element of stack
	peek()
	{
		if (this.top == null)
		{
			return null;
		}
		return this.top.element;
	}
}
class BinarySearchTree
{
	constructor()
	{
		this.root = null;
	}
	//Display inorder elements
	printInorder(node)
	{
		if (node != null)
		{
			this.printInorder(node.left);
			//Print node value
			process.stdout.write(" " + node.data);
			this.printInorder(node.right);
		}
	}
	//Display pre order elements
	printPreorder(node)
	{
		if (node != null)
		{
			//Print node value
			process.stdout.write(" " + node.data);
			this.printPreorder(node.left);
			this.printPreorder(node.right);
		}
	}
	//Display postorder elements
	printPostorder(node)
	{
		if (node != null)
		{
			this.printPostorder(node.left);
			this.printPostorder(node.right);
			//Print node value
			process.stdout.write(" " + node.data);
		}
	}
	//Handles the request of display the element of tree
	printTree()
	{
		if (this.root == null)
		{
			return;
		}
		// Display tree elements in three formats
		process.stdout.write("\n Preorder :");
		this.printPreorder(this.root);
		process.stdout.write("\n Inorder :");
		this.printInorder(this.root);
		process.stdout.write("\n Postorder :");
		this.printPostorder(this.root);
		process.stdout.write("\n");
	}
}
class Construct
{
	// Handle request to construct bst using given preorder sequence
	makeTree(preorder, n)
	{
		if (n <= 0)
		{
			return null;
		}
		// Create an empty tree
		var tree = new BinarySearchTree();
		// Create an empty stack
		var st = new MyStack();
		// Create first node of tree
		var node = new TreeNode(preorder[0]);
		// Add first element into stack
		st.push(node);
		tree.root = node;
		var i = 1;
		while (i < n)
		{
			node = null;
			// Find new inserted node position
			while (st.isEmpty() == false && st.peek().data < preorder[i])
			{
				// Get the  top element of stack
				node = st.peek();
				// Remove top element of stack
				st.pop();
			}
			if (node != null)
			{
				// Add node in right subtree
				node.right = new TreeNode(preorder[i]);
				//  Add stack element
				st.push(node.right);
			}
			else
			{
				// Get the  top element of stack
				node = st.peek();
				// Add node in left subtree
				node.left = new TreeNode(preorder[i]);
				//  Add stack element
				st.push(node.left);
			}
			i++;
		}
		return tree;
	}
}

function main()
{
	var preorder = [15, 13, 12, 11, 14, 20, 19, 17, 18, 21, 22];
	var n = preorder.length;
	var task = new Construct();
	var tree = task.makeTree(preorder, n);
	/*
	            15
	         /     \
	        13      20
	       /  \     / \
	      12  14   19  21
	     /        /      \
	    11       17       22
	              \
	               18
	    -----------------------
	    Built binary search tree         
	*/
	tree.printTree();
}
main();

Output

 Preorder : 15 13 12 11 14 20 19 17 18 21 22
 Inorder : 11 12 13 14 15 17 18 19 20 21 22
 Postorder : 11 12 14 13 18 17 19 22 21 20 15
#    Python 3 Program for
#    Construct BST from given preorder traversal using stack

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

#  Define stack node
class StackNode :
	
	def __init__(self, element, top) :
		self.element = element
		self.next = top
	

#  Define a custom stack
class MyStack :
	
	def __init__(self) :
		# Set node values
		self.top = None
		self.size = 0
	
	#  Add node at the top of stack
	def push(self, element) :
		self.top = StackNode(element, self.top)
		self.size += 1
	
	def isEmpty(self) :
		if (self.size > 0 and self.top != None) :
			return False
		else :
			return True
		
	
	#  Remove top element of stack
	def pop(self) :
		if (self.size > 0 and self.top != None) :
			temp = self.top
			#  Change top element of stack
			self.top = temp.next
			#  remove previous top
			temp = None
			self.size -= 1
		
	
	#  return top element of stack
	def peek(self) :
		if (self.top == None) :
			return None
		
		return self.top.element
	

class BinarySearchTree :
	
	def __init__(self) :
		self.root = None
	
	# Display inorder elements
	def printInorder(self, node) :
		if (node != None) :
			self.printInorder(node.left)
			# Print node value
			print(" ", node.data, end = "")
			self.printInorder(node.right)
		
	
	# Display pre order elements
	def printPreorder(self, node) :
		if (node != None) :
			# Print node value
			print(" ", node.data, end = "")
			self.printPreorder(node.left)
			self.printPreorder(node.right)
		
	
	# Display postorder elements
	def printPostorder(self, node) :
		if (node != None) :
			self.printPostorder(node.left)
			self.printPostorder(node.right)
			# Print node value
			print(" ", node.data, end = "")
		
	
	# Handles the request of display the element of tree
	def printTree(self) :
		if (self.root == None) :
			return
		
		#  Display tree elements in three formats
		print("\n Preorder :", end = "")
		self.printPreorder(self.root)
		print("\n Inorder :", end = "")
		self.printInorder(self.root)
		print("\n Postorder :", end = "")
		self.printPostorder(self.root)
		print(end = "\n")
	

class Construct :
	#  Handle request to construct bst using given preorder sequence
	def makeTree(self, preorder, n) :
		if (n <= 0) :
			return None
		
		#  Create an empty tree
		tree = BinarySearchTree()
		#  Create an empty stack
		st = MyStack()
		#  Create first node of tree
		node = TreeNode(preorder[0])
		#  Add first element into stack
		st.push(node)
		tree.root = node
		i = 1
		while (i < n) :
			node = None
			#  Find new inserted node position
			while (st.isEmpty() == False and st.peek().data < preorder[i]) :
				#  Get the  top element of stack
				node = st.peek()
				#  Remove top element of stack
				st.pop()
			
			if (node != None) :
				#  Add node in right subtree
				node.right = TreeNode(preorder[i])
				#   Add stack element
				st.push(node.right)
			else :
				#  Get the  top element of stack
				node = st.peek()
				#  Add node in left subtree
				node.left = TreeNode(preorder[i])
				#   Add stack element
				st.push(node.left)
			
			i += 1
		
		return tree
	

def main() :
	preorder = [15, 13, 12, 11, 14, 20, 19, 17, 18, 21, 22]
	n = len(preorder)
	task = Construct()
	tree = task.makeTree(preorder, n)
	# 
	#             15
	#          /     \
	#         13      20
	#        /  \     / \
	#       12  14   19  21
	#      /        /      \
	#     11       17       22
	#               \
	#                18
	#     -----------------------
	#     Built binary search tree         
	
	tree.printTree()

if __name__ == "__main__": main()

Output

 Preorder :  15  13  12  11  14  20  19  17  18  21  22
 Inorder :  11  12  13  14  15  17  18  19  20  21  22
 Postorder :  11  12  14  13  18  17  19  22  21  20  15
#    Ruby Program for
#    Construct BST from given preorder traversal using stack

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

#  Define stack node
class StackNode  
	# Define the accessor and reader of class StackNode  
	attr_reader :element, :next
	attr_accessor :element, :next
 
	
	def initialize(element, top) 
		self.element = element
		self.next = top
	end

end

#  Define a custom stack
class MyStack  
	# Define the accessor and reader of class MyStack  
	attr_reader :top, :size
	attr_accessor :top, :size
 
	
	def initialize() 
		# Set node values
		self.top = nil
		self.size = 0
	end

	#  Add node at the top of stack
	def push(element) 
		self.top = StackNode.new(element, self.top)
		self.size += 1
	end

	def isEmpty() 
		if (self.size > 0 && self.top != nil) 
			return false
		else 
			return true
		end

	end

	#  Remove top element of stack
	def pop() 
		if (self.size > 0 && self.top != nil) 
			temp = self.top
			#  Change top element of stack
			self.top = temp.next
			#  remove previous top
			temp = nil
			self.size -= 1
		end

	end

	#  return top element of stack
	def peek() 
		if (self.top == nil) 
			return nil
		end

		return self.top.element
	end

end

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

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

	end

	# Display pre order elements
	def printPreorder(node) 
		if (node != nil) 
			# Print node value
			print(" ", node.data)
			self.printPreorder(node.left)
			self.printPreorder(node.right)
		end

	end

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

	end

	# Handles the request of display the element of tree
	def printTree() 
		if (self.root == nil) 
			return
		end

		#  Display tree elements in three formats
		print("\n Preorder :")
		self.printPreorder(self.root)
		print("\n Inorder :")
		self.printInorder(self.root)
		print("\n Postorder :")
		self.printPostorder(self.root)
		print("\n")
	end

end

class Construct 
	#  Handle request to construct bst using given preorder sequence
	def makeTree(preorder, n) 
		if (n <= 0) 
			return nil
		end

		#  Create an empty tree
		tree = BinarySearchTree.new()
		#  Create an empty stack
		st = MyStack.new()
		#  Create first node of tree
		node = TreeNode.new(preorder[0])
		#  Add first element into stack
		st.push(node)
		tree.root = node
		i = 1
		while (i < n) 
			node = nil
			#  Find new inserted node position
			while (st.isEmpty() == false && st.peek().data < preorder[i]) 
				#  Get the  top element of stack
				node = st.peek()
				#  Remove top element of stack
				st.pop()
			end

			if (node != nil) 
				#  Add node in right subtree
				node.right = TreeNode.new(preorder[i])
				#   Add stack element
				st.push(node.right)
			else 
				#  Get the  top element of stack
				node = st.peek()
				#  Add node in left subtree
				node.left = TreeNode.new(preorder[i])
				#   Add stack element
				st.push(node.left)
			end

			i += 1
		end

		return tree
	end

end

def main() 
	preorder = [15, 13, 12, 11, 14, 20, 19, 17, 18, 21, 22]
	n = preorder.length
	task = Construct.new()
	tree = task.makeTree(preorder, n)
	# 
	#             15
	#          /     \
	#         13      20
	#        /  \     / \
	#       12  14   19  21
	#      /        /      \
	#     11       17       22
	#               \
	#                18
	#     -----------------------
	#     Built binary search tree         
	
	tree.printTree()
end

main()

Output

 Preorder : 15 13 12 11 14 20 19 17 18 21 22
 Inorder : 11 12 13 14 15 17 18 19 20 21 22
 Postorder : 11 12 14 13 18 17 19 22 21 20 15
/*
   Scala Program for
   Construct BST from given preorder traversal using stack
*/
class TreeNode(var data: Int , var left: TreeNode , var right: TreeNode)
{
	def this(data: Int)
	{
		this(data, null, null);
	}
}
// Define stack node
class StackNode(var element: TreeNode , var next: StackNode);
// Define a custom stack
class MyStack(var top: StackNode , var size: Int)
{
	def this()
	{
		this(null, 0);
	}
	// Add node at the top of stack
	def push(element: TreeNode): Unit = {
		this.top = new StackNode(element, this.top);
		this.size += 1;
	}
	def isEmpty(): Boolean = {
		if (this.size > 0 && this.top != null)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	// Remove top element of stack
	def pop(): Unit = {
		if (this.size > 0 && this.top != null)
		{
			var temp: StackNode = this.top;
			// Change top element of stack
			this.top = temp.next;
			// remove previous top
			temp = null;
			this.size -= 1;
		}
	}
	// return top element of stack
	def peek(): TreeNode = {
		if (this.top == null)
		{
			return null;
		}
		return this.top.element;
	}
}
class BinarySearchTree(var root: TreeNode)
{
	def this()
	{
		this(null);
	}
	//Display inorder elements
	def printInorder(node: TreeNode): Unit = {
		if (node != null)
		{
			this.printInorder(node.left);
			//Print node value
			print(" " + node.data);
			this.printInorder(node.right);
		}
	}
	//Display pre order elements
	def printPreorder(node: TreeNode): Unit = {
		if (node != null)
		{
			//Print node value
			print(" " + node.data);
			this.printPreorder(node.left);
			this.printPreorder(node.right);
		}
	}
	//Display postorder elements
	def printPostorder(node: TreeNode): Unit = {
		if (node != null)
		{
			this.printPostorder(node.left);
			this.printPostorder(node.right);
			//Print node value
			print(" " + node.data);
		}
	}
	//Handles the request of display the element of tree
	def printTree(): Unit = {
		if (this.root == null)
		{
			return;
		}
		// Display tree elements in three formats
		print("\n Preorder :");
		this.printPreorder(this.root);
		print("\n Inorder :");
		this.printInorder(this.root);
		print("\n Postorder :");
		this.printPostorder(this.root);
		print("\n");
	}
}
class Construct
{
	// Handle request to construct bst using given preorder sequence
	def makeTree(preorder: Array[Int], n: Int): BinarySearchTree = {
		if (n <= 0)
		{
			return null;
		}
		// Create an empty tree
		var tree: BinarySearchTree = new BinarySearchTree();
		// Create an empty stack
		var st: MyStack = new MyStack();
		// Create first node of tree
		var node: TreeNode = new TreeNode(preorder(0));
		// Add first element into stack
		st.push(node);
		tree.root = node;
		var i: Int = 1;
		while (i < n)
		{
			node = null;
			// Find new inserted node position
			while (st.isEmpty() == false && st.peek().data < preorder(i))
			{
				// Get the  top element of stack
				node = st.peek();
				// Remove top element of stack
				st.pop();
			}
			if (node != null)
			{
				// Add node in right subtree
				node.right = new TreeNode(preorder(i));
				//  Add stack element
				st.push(node.right);
			}
			else
			{
				// Get the  top element of stack
				node = st.peek();
				// Add node in left subtree
				node.left = new TreeNode(preorder(i));
				//  Add stack element
				st.push(node.left);
			}
			i += 1;
		}
		return tree;
	}
}
object Main
{
	def main(args: Array[String]): Unit = {
		var preorder: Array[Int] = Array(15, 13, 12, 11, 14, 20, 19, 17, 18, 21, 22);
		var n: Int = preorder.length;
		var task: Construct = new Construct();
		var tree: BinarySearchTree = task.makeTree(preorder, n);
		/*
		            15
		         /     \
		        13      20
		       /  \     / \
		      12  14   19  21
		     /        /      \
		    11       17       22
		              \
		               18
		    -----------------------
		    Built binary search tree         
		*/
		tree.printTree();
	}
}

Output

 Preorder : 15 13 12 11 14 20 19 17 18 21 22
 Inorder : 11 12 13 14 15 17 18 19 20 21 22
 Postorder : 11 12 14 13 18 17 19 22 21 20 15
/*
   Swift 4 Program for
   Construct BST from given preorder traversal using stack
*/
class TreeNode
{
	var data: Int;
	var left: TreeNode? ;
	var right: TreeNode? ;
	init(_ data: Int)
	{
		self.data = data;
		self.left = nil;
		self.right = nil;
	}
}
// Define stack node
class StackNode
{
	var element: TreeNode? ;
	var next: StackNode? ;
	init(_ element: TreeNode? , _ top : StackNode? )
	{
		self.element = element;
		self.next = top;
	}
}
// Define a custom stack
class MyStack
{
	var top: StackNode? ;
	var size: Int;
	init()
	{
		//Set node values
		self.top = nil;
		self.size = 0;
	}
	// Add node at the top of stack
	func push(_ element: TreeNode? )
	{
		self.top = StackNode(element, self.top);
		self.size += 1;
	}
	func isEmpty()->Bool
	{
		if (self.size > 0 && self.top  != nil)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	// Remove top element of stack
	func pop()
	{
		if (self.size > 0 && self.top  != nil)
		{
			var temp: StackNode? = self.top;
			// Change top element of stack
			self.top = temp!.next;
			// remove previous top
			temp = nil;
			self.size -= 1;
		}
	}
	// return top element of stack
	func peek()->TreeNode?
	{
		if (self.top == nil)
		{
			return nil;
		}
		return self.top!.element;
	}
}
class BinarySearchTree
{
	var root: TreeNode? ;
	init()
	{
		self.root = nil;
	}
	//Display inorder elements
	func printInorder(_ node: TreeNode? )
	{
		if (node  != nil)
		{
			self.printInorder(node!.left);
			//Print node value
			print(" ", node!.data, terminator: "");
			self.printInorder(node!.right);
		}
	}
	//Display pre order elements
	func printPreorder(_ node: TreeNode? )
	{
		if (node  != nil)
		{
			//Print node value
			print(" ", node!.data, terminator: "");
			self.printPreorder(node!.left);
			self.printPreorder(node!.right);
		}
	}
	//Display postorder elements
	func printPostorder(_ node: TreeNode? )
	{
		if (node  != nil)
		{
			self.printPostorder(node!.left);
			self.printPostorder(node!.right);
			//Print node value
			print(" ", node!.data, terminator: "");
		}
	}
	//Handles the request of display the element of tree
	func printTree()
	{
		if (self.root == nil)
		{
			return;
		}
		// Display tree elements in three formats
		print("\n Preorder :", terminator: "");
		self.printPreorder(self.root);
		print("\n Inorder :", terminator: "");
		self.printInorder(self.root);
		print("\n Postorder :", terminator: "");
		self.printPostorder(self.root);
		print(terminator: "\n");
	}
}
class Construct
{
	// Handle request to construct bst using given preorder sequence
	func makeTree(_ preorder: [Int], _ n: Int)->BinarySearchTree?
	{
		if (n <= 0)
		{
			return nil;
		}
		// Create an empty tree
		let tree: BinarySearchTree? = BinarySearchTree();
		// Create an empty stack
		let st: MyStack = MyStack();
		// Create first node of tree
		var node: TreeNode? = TreeNode(preorder[0]);
		// Add first element into stack
		st.push(node);
		tree!.root = node;
		var i: Int = 1;
		while (i < n)
		{
			node = nil;
			// Find new inserted node position
			while (st.isEmpty() == false && st.peek()!.data < preorder[i])
			{
				// Get the  top element of stack
				node = st.peek();
				// Remove top element of stack
				st.pop();
			}
			if (node  != nil)
			{
				// Add node in right subtree
				node!.right = TreeNode(preorder[i]);
				//  Add stack element
				st.push(node!.right);
			}
			else
			{
				// Get the  top element of stack
				node = st.peek();
				// Add node in left subtree
				node!.left = TreeNode(preorder[i]);
				//  Add stack element
				st.push(node!.left);
			}
			i += 1;
		}
		return tree;
	}
}
func main()
{
	let preorder: [Int] = [15, 13, 12, 11, 14, 20, 19, 17, 18, 21, 22];
	let n: Int = preorder.count;
	let task: Construct = Construct();
	let tree: BinarySearchTree? = task.makeTree(preorder, n);
	/*
	            15
	         /     \
	        13      20
	       /  \     / \
	      12  14   19  21
	     /        /      \
	    11       17       22
	              \
	               18
	    -----------------------
	    Built binary search tree         
	*/
	tree!.printTree();
}
main();

Output

 Preorder :  15  13  12  11  14  20  19  17  18  21  22
 Inorder :  11  12  13  14  15  17  18  19  20  21  22
 Postorder :  11  12  14  13  18  17  19  22  21  20  15
/*
   Kotlin Program for
   Construct BST from given preorder traversal using stack
*/
class TreeNode
{
	var data: Int;
	var left: TreeNode ? ;
	var right: TreeNode ? ;
	constructor(data: Int)
	{
		this.data = data;
		this.left = null;
		this.right = null;
	}
}
// Define stack node
class StackNode
{
	var element: TreeNode ? ;
	var next: StackNode ? ;
	constructor(element: TreeNode ? , top : StackNode ? )
	{
		this.element = element;
		this.next = top;
	}
}
// Define a custom stack
class MyStack
{
	var top: StackNode ? ;
	var size: Int;
	constructor()
	{
		//Set node values
		this.top = null;
		this.size = 0;
	}
	// Add node at the top of stack
	fun push(element: TreeNode ? ): Unit
	{
		this.top = StackNode(element, this.top);
		this.size += 1;
	}
	fun isEmpty(): Boolean
	{
		if (this.size > 0 && this.top != null)
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	// Remove top element of stack
	fun pop(): Unit
	{
		if (this.size > 0 && this.top != null)
		{
			var temp: StackNode ? = this.top;
			// Change top element of stack
			this.top = temp?.next;
			this.size -= 1;
		}
	}
	// return top element of stack
	fun peek(): TreeNode ?
	{
		if (this.top == null)
		{
			return null;
		}
		return this.top?.element;
	}
}
class BinarySearchTree
{
	var root: TreeNode ? ;
	constructor()
	{
		this.root = null;
	}
	//Display inorder elements
	fun printInorder(node: TreeNode ? ): Unit
	{
		if (node != null)
		{
			this.printInorder(node.left);
			//Print node value
			print(" " + node.data);
			this.printInorder(node.right);
		}
	}
	//Display pre order elements
	fun printPreorder(node: TreeNode ? ): Unit
	{
		if (node != null)
		{
			//Print node value
			print(" " + node.data);
			this.printPreorder(node.left);
			this.printPreorder(node.right);
		}
	}
	//Display postorder elements
	fun printPostorder(node: TreeNode ? ): Unit
	{
		if (node != null)
		{
			this.printPostorder(node.left);
			this.printPostorder(node.right);
			//Print node value
			print(" " + node.data);
		}
	}
	//Handles the request of display the element of tree
	fun printTree(): Unit
	{
		if (this.root == null)
		{
			return;
		}
		// Display tree elements in three formats
		print("\n Preorder :");
		this.printPreorder(this.root);
		print("\n Inorder :");
		this.printInorder(this.root);
		print("\n Postorder :");
		this.printPostorder(this.root);
		print("\n");
	}
}
class Construct
{
	// Handle request to construct bst using given preorder sequence
	fun makeTree(preorder: Array < Int > , n: Int): BinarySearchTree 
	{
      	// Create an empty tree
		var tree: BinarySearchTree = BinarySearchTree();
		if (n <= 0)
		{
			return tree;
		}
	
		// Create an empty stack
		var st: MyStack = MyStack();
		// Create first node of tree
		var node: TreeNode ? = TreeNode(preorder[0]);
		// Add first element into stack
		st.push(node);
		tree.root = node;
		var i: Int = 1;
		while (i < n)
		{
			node = null;
			// Find new inserted node position
			while (st.isEmpty() == false && st.peek()!!.data < preorder[i])
			{
				// Get the  top element of stack
				node = st.peek();
				// Remove top element of stack
				st.pop();
			}
			if (node != null)
			{
				// Add node in right subtree
				node.right = TreeNode(preorder[i]);
				//  Add stack element
				st.push(node.right);
			}
			else
			{
				// Get the  top element of stack
				node = st.peek();
				// Add node in left subtree
				node?.left = TreeNode(preorder[i]);
				//  Add stack element
				st.push(node?.left);
			}
			i += 1;
		}
		return tree;
	}
}
fun main(args: Array < String > ): Unit
{
	var preorder: Array <Int> = arrayOf(15, 13, 12, 11, 14, 20, 19, 17, 18, 21, 22);
	var n: Int = preorder.count();
	var task: Construct = Construct();
	var tree: BinarySearchTree? = task.makeTree(preorder, n);
	/*
	            15
	         /     \
	        13      20
	       /  \     / \
	      12  14   19  21
	     /        /      \
	    11       17       22
	              \
	               18
	    -----------------------
	    Built binary search tree         
	*/
	tree?.printTree();
}

Output

 Preorder : 15 13 12 11 14 20 19 17 18 21 22
 Inorder : 11 12 13 14 15 17 18 19 20 21 22
 Postorder : 11 12 14 13 18 17 19 22 21 20 15




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