Jun 26, 2017

create a balance BST from a sorted list


#include <iostream>
#include <string.h>
using namespace std;

int max(int p, int q)
{
 return ((p>q) ? p : q);
}


class node;
class node
{
 public:
  char c;
  node* l;
  node* r;
};

void printinorder(node* root)
{
 if(!root)
 {
  return;
 }
 
 printinorder(root->l);
 cout << root->c << " ";
 printinorder(root->r);
}

int depth(node* root)
{
 if(!root)
  return 0;
 return 1 + max(depth(root->l), depth(root->r));
}

void printbylevel(node* root, int depth, int level)
{
 if(!root)
  return;
  
 if(depth == level)
 {
  cout << root->c;
 }
 else
 {
  printbylevel(root->l, depth, level+1);
  cout<<"  ";
  printbylevel(root->r, depth, level+1);
 }
}

void printlevelorder(node *root)
{
 int d = depth(root);
 for(int i=0; i<d; i++)
 {
  for(int j=0;j<d-i;j++)
   cout << " ";
  printbylevel(root, i, 0);
  cout << endl;
 }
}

node* createBalancedBST(char s[], int l, int r)
{
 if(l==r)
 {
  node* t = new node();
  t->c = s[l];
  t->l = NULL;
  t->r = NULL;
  return t;
 }
 else if(l>r)
  return NULL;
 
 int median = (l+r)>>1;
 node* t = new node();
 t->c = s[median];
 t->l = createBalancedBST(s, l, median-1);
 t->r = createBalancedBST(s, median+1, r);
 return t;
}

int main() {
 // your code goes here
 char s[100];
 cin >> s;
 node* root = createBalancedBST(s, 0, strlen(s)-1);
 cout << "tree input is:" << s << endl;
 cout << "inorder: ";
 printinorder(root);
 cout << "\ntree depth=" << depth(root) << endl;
 cout << "level order: \n";
 printlevelorder(root);
 
 return 0;
}

tree input is:abcdefghijklmnopqrstuvwxyz
inorder: a b c d e f g h i j k l m n o p q r s t u v w x y z 
tree depth=5
level order: 
     m
    f  t
   c  i  p  w
  a  d  g  k  n  r  u  y
   b    e    h  j  l    o  q  s    v  x  z

No comments: