Home » Interview coding problems/challenges

Convert Sorted Array to Binary Search Tree

In this article, we are going to see how to convert a sorted array into a binary search tree? This problem can be featured in coding interview rounds.
Submitted by Radib Kar, on January 14, 2019

Problem statement:

Given an array where elements are sorted in ascending order, convert it to a height balanced BST.

For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.

Example:

Let the sorted array to be:
[-1, 3, 6, 8]
The corresponding balanced BST is:
               3
             /   \
           -1     6
                    \
                      8

Solution:

The algorithm is simply finding the median in the sorted array and assigning it as a root. Then process the subtrees recursively.

Let the function to build the balanced BST from the sorted array is:

buildBST() which has parameters: sorted array, lower index, higher index

has return type: TreeNode* // returns the root actually

Function buildBST(sorted array, lower index , higher index)
    1.  Base case:
        IF lower index>higher index
            Return NULL
    2.  Declare middle index as (lower index + higher index)/2
    3.  root=createnode(array[middle index]);
    4.  Create the left subtree recursively
        Root->left=buildBST(sorted array, lower index, middle index-1)
    5.  Create the right subtree recursively
        Root->left=buildBST(sorted array, middle index-1,higher index)
    6.  Return root
END FUNCTION

In the main function we call,

    Root=buildBST (sorted array, 0, size of array-1)

C++ implementation

#include <bits/stdc++.h>
using namespace std;

// TreeNode node type
class TreeNode{
	public:             
		int val;           //value
		TreeNode *left;    //pointer to left child
		TreeNode *right;   //pointer to right child
};

// creating new node
TreeNode* newnode(int data)  
{ 
	TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); 
	node->val = data; 
	node->left = NULL; 
	node->right = NULL; 
	return(node); 
}

TreeNode* buildBST(vector<int> nums,int low,int high){
	if(low>high)
		return NULL;
	
	int mid=(low+high)/2;
	TreeNode* root=newnode(nums[mid]); //creates new nodes
	root->left=buildBST(nums,low,mid-1);
	root->right=buildBST(nums,mid+1,high);

	return root;
}


TreeNode* sortedArrayToBST(vector<int>& nums) {
	TreeNode* root=buildBST(nums,0,nums.size()-1);
	return root;
}

void levelOrder(TreeNode* root) {
	cout<<"root: \n";
	queue<TreeNode*> q;

	if(root==NULL){
		cout<<"empty tree\n";
	}
	
	int count=1;		
	TreeNode* temp;
	q.push(root);
	q.push(NULL);

	while(!q.empty()){
		temp=q.front();
		q.pop();
		if(temp==NULL){
			if(!q.empty()){
				cout<<"\nend of level: "<<count++<<endl;
				q.push(NULL);
			}
		}
		else{
			cout<<temp->val<<" ";
			if(temp->left)
				q.push(temp->left);
			if(temp->right)
				q.push(temp->right);
		}
	}
	cout<<"\nend of level: "<<count<<endl;
}

int main(){
	int n,no;
	
	cout<<"enter no of elements\n";
	cin>>n;
	vector<int> v;
	
	cout<<"enter the sorted array\n";
	while(n--){
		cin>>no;
		v.push_back(no);
	}
	
	TreeNode* root=sortedArrayToBST(v);
	cout<<"displaying level order traversal\n";
	levelOrder(root);

	return 0;
}

Output

enter no of elements
4
enter the sorted array
-1 3 6 8
displaying level order traversal
root:
3
end of level: 1
-1 6
end of level: 2
8
end of level: 3

Example with explanation

For simplicity all nodes are represented by its value
Let the sorted array to be:
A=-1, 3, 6, 8

So in the main function it calls:
Root=buildBST( A, 0, 3)
---------------------------------------------------

buildBST( A, 0, 3)
base case isn’t met
mid= 1
root= A[1]=3 
3->left=buildBST( A, 0, 0)
3->right= buildBST( A, 2, 3)
Return 3 (node)
---------------------------------------------------

buildBST( A, 0, 0)
base case isn’t met
mid= 0
root= A[0]=-1
-1->left=buildBST(A, 0, -1)
(-1)->right= buildBST(A, 1, 0)
Returns -1(node)
---------------------------------------------------

buildBST( A, 2, 3)
base case isn’t met
mid= 2
root= A[2]=6
6->left=buildBST(A, 2, 1)
(6)->right= buildBST(A, 3, 3)
Returns 6(node)
---------------------------------------------------

buildBST( A, 0, -1)
base case is met
Returns null
---------------------------------------------------

buildBST( A, 1, 0)
base case is met
Returns null
---------------------------------------------------

buildBST( A, 2, 1)
base case is met
Returns null
---------------------------------------------------

buildBST( A, 3, 3)
base case isn’t met
mid= 3
root= A[3]=8
8->left=buildBST(A, 3, 2)
(8)->right= buildBST(A, 4, 3)
Returns 8(node)
---------------------------------------------------

buildBST( A, 3, 2)
base case is met
Returns null
---------------------------------------------------

buildBST( A, 4, 3)
base case is met
Returns null


So,
8->left=NULL
8->right=NULL
6->left=NULL
6->right=8
-1->left=NULL
-1->right=NULL
3->left=-1
3->right=6

So the tree becomes:
               3
            /    \
         -1       6
                   \
                    8


Comments and Discussions!

Load comments ↻





Copyright © 2024 www.includehelp.com. All rights reserved.