All pastes #183957 Raw Edit

Miscellany

public text v1 · immutable
#183957 ·published 2006-09-27 12:10 UTC
rendered paste body
#include "BinarySearchTree.h"
#include <cstdlib>
#include <iostream>
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<vector <int> > 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<int> BinarySearchTree::nextPostOrder()
{
	vector<int> n = *postOrderIterator;
	postOrderIterator++;
	return n;
}

void BinarySearchTree::serialisePostOrder(tree t)
{
	if(t!=NULL)
	{
		serialisePostOrder(t->left);
		serialisePostOrder(t->right);

		vector<int> a;
		a.push_back(t->getKey());
		a.push_back(t->getDepth());
		a.push_back(t->getPos());
		postOrder.push_back(a);

		postOrderIterator = postOrder.begin();
	}
}
vector<int> BinarySearchTree::nextPreOrder()
{
	vector<int> n = *preOrderIterator;
	preOrderIterator++;
	return n;
}

void BinarySearchTree::serialisePreOrder(tree t)
{
	if(t!=NULL)
	{
		vector<int> 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<int> BinarySearchTree::nextInOrder()
{
	vector<int> n = *inOrderIterator;
	inOrderIterator++;
	return n;
}

void BinarySearchTree::serialiseInOrder(tree t)
{
	if(t!=NULL)
	{
		serialiseInOrder(t->left);

		vector<int> 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;
}