#include "BinarySearchTree.h" #include #include using namespace std; BinarySearchTree::BinarySearchTree() { left = NULL; right = NULL; key = -1; depth = -1; pos = -1; } BinarySearchTree::BinarySearchTree(int k) { left = NULL; right = NULL; key = k; depth = 0; pos = 0; } BinarySearchTree::~BinarySearchTree() { delete this->left; delete this->right; } void BinarySearchTree::draw( tree t, bool endline) { if(t!=NULL) { for(int i = 0 ; i < t->getPos(); i++) { cout << "\t"; } cout << t->getKey(); if(endline) cout << endl; draw(t->left,false); draw(t->right,true); } } void BinarySearchTree::setInOrderPos(tree t, int &count) { if(t != NULL ) { setInOrderPos(t->left, count); t->setPos(++count); setInOrderPos(t->right, ++count); } } void BinarySearchTree::insert(int k, tree &t, int depth) { if( t == NULL ) { t = new BinarySearchTree(k); t->setDepth(depth); t->left = NULL; t->right = NULL; } else if( k < t->getKey() ) { insert(k, t->left, t->getDepth()+1); } else if( k > t->getKey() ) { insert(k, t->right, t->getDepth()+1); } else { cout << "Duplicate key" << endl; } } BinarySearchTree BinarySearchTree::balanceVector(vector > v, int f, int l) { BinarySearchTree *balancedTree = NULL; int n = (f + (l - f ))/2; if(f - l == 0) { balancedTree->insert(v[n][0], balancedTree, 0); balancedTree->draw(balancedTree,true); } else { balancedTree->insert(v[n][0], balancedTree, 0); balancedTree->draw(balancedTree,true); *balancedTree->left = balanceVector(v, f, n-1); *balancedTree->right = balanceVector(v, n+1, l); } return *balancedTree; } BinarySearchTree BinarySearchTree::balance(tree t) { BinarySearchTree *balancedTree = NULL; t->serialiseInOrder(t); *balancedTree = balanceVector(t->inOrder, 0, t->inOrder.size()-1); return *balancedTree; } vector BinarySearchTree::nextPostOrder() { vector n = *postOrderIterator; postOrderIterator++; return n; } void BinarySearchTree::serialisePostOrder(tree t) { if(t!=NULL) { serialisePostOrder(t->left); serialisePostOrder(t->right); vector a; a.push_back(t->getKey()); a.push_back(t->getDepth()); a.push_back(t->getPos()); postOrder.push_back(a); postOrderIterator = postOrder.begin(); } } vector BinarySearchTree::nextPreOrder() { vector n = *preOrderIterator; preOrderIterator++; return n; } void BinarySearchTree::serialisePreOrder(tree t) { if(t!=NULL) { vector a; a.push_back(t->getKey()); a.push_back(t->getDepth()); a.push_back(t->getPos()); preOrder.push_back(a); serialisePreOrder(t->left); serialisePreOrder(t->right); preOrderIterator = preOrder.begin(); } } vector BinarySearchTree::nextInOrder() { vector n = *inOrderIterator; inOrderIterator++; return n; } void BinarySearchTree::serialiseInOrder(tree t) { if(t!=NULL) { serialiseInOrder(t->left); vector a; a.push_back(t->getKey()); a.push_back(t->getDepth()); a.push_back(t->getPos()); inOrder.push_back(a); serialiseInOrder(t->right); inOrderIterator = inOrder.begin(); } } int BinarySearchTree::getSize(tree t) { if(t == NULL) return 0; else return 1+getSize(t->left)+getSize(t->right); } int BinarySearchTree::getKey() { return key; } int BinarySearchTree::getPos() { return pos; } int BinarySearchTree::getDepth() { return depth; } void BinarySearchTree::setPos(int p) { pos = p; } void BinarySearchTree::setDepth(int d) { depth = d; }