/*
* If all points are in k – dimensions then Select one of the dimension for a level.
* Get median element in selected dimension.
* Push all points smaller than median elements in left sub tree and all greater points in right sub tree.
* Recursively call the buildTree function with leftSubset and Set leftChild of curNode.
* Recursively call the buildTree function with rightSubset and set rightChild of curNode.
*/
#include <iostream>
#include <vector>
using namespace std;
class Point
{
public:
int x;
int y;
Point()
{
x = 0;
y = 0;
}
Point(int xp, int yp)
{
x = xp;
y = yp;
}
};
class TreeNode
{
public:
Point p;
TreeNode *left;
TreeNode *right;
TreeNode()
{
left = NULL;
right = NULL;
}
TreeNode(Point pt)
{
p = pt;
left = NULL;
right = NULL;
}
};
class KDTree
{
TreeNode *root;
public:
KDTree()
{
root = NULL;
}
TreeNode* getRoot()
{
return root;
}
TreeNode* createNode(Point ptr)
{
TreeNode *n = new TreeNode(ptr);
return n;
}
void CreateLeftRightSubset(vector <Point> PointSet, Point median, vector <Point> &leftSet, vector <Point> &rightSet, int depth)
{
// Check x coordinates
if(depth %2 == 0)
{
// Push all points having x coordinate
// less than median to leftSet and rest to right set
for(int i=0; i < PointSet.size() ; i++)
{
// Skip median.
if(PointSet[i].x == median.x && PointSet[i].y == median.y )
continue;
if(PointSet[i].x < median.x)
leftSet.push_back(PointSet[i]);
else
rightSet.push_back(PointSet[i]);
}
}
// Check y coordinates
else
{
// Push all points having y coordinate
// less than median to leftSet and rest to rightSet.
for(int i=0; i < PointSet.size() ; i++)
{
// Skip median.
if(PointSet[i].x == median.x && PointSet[i].y == median.y )
continue;
if(PointSet[i].y < median.y)
leftSet.push_back(PointSet[i]);
else
rightSet.push_back(PointSet[i]);
}
}
}
// Sort vector on x coordinates
void sortX(vector <Point> &PointSet);
// Sort vector on y coordinates
void sortY(vector <Point> &PointSet);
// Return median of all points in PointSet.
Point getMedian(vector <Point> &PointSet , int depth)
{
//Median of x coordinates.
if(depth % 2 ==0 )
{
sortX(PointSet);
Point M = PointSet[PointSet.size()/2];
// To prevent infinite recurrence
if(M.x > PointSet[0].x)
{
return M;
}
M.x = M.x+1;
return M;
}
//Median of y coordinates.
else
{
sortY(PointSet);
Point M = PointSet[PointSet.size()/2];
// TO prevent infinite recurrence
if(M.y > PointSet[0].y)
{
return M;
}
M.y = M.y+1;
return M;
}
}
TreeNode* buildTree(vector <Point> PointSet , int depth)
{
if(PointSet.size() == 1)
return (createNode(PointSet[0]));
Point M = getMedian(PointSet,depth);
TreeNode* curNode = createNode(M);
if(isEmpty())
root = curNode;
vector <Point> leftSet;
vector <Point> rightSet;
CreateLeftRightSubset(PointSet,M,leftSet,rightSet,depth);
if(leftSet.size() != 0)
curNode->left = buildTree(leftSet, depth+1);
if(rightSet.size() != 0)
curNode->right = buildTree(rightSet, depth+1);
return curNode;
}
};
int main()
{
vector <Point> v;
v.push_back(Point(6,1));
v.push_back(Point(5,5));
v.push_back(Point(9,6));
v.push_back(Point(3,6));
v.push_back(Point(4,9));
v.push_back(Point(4,0));
v.push_back(Point(7,9));
v.push_back(Point(2,9));
KDTree tree;
tree.buildTree(v,0);
tree.preorder(tree.getRoot());
system("pause");
}
Saturday, 22 June 2013
Implementation of K-DTrees (2-D)
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment