您的位置:首页 > 其它

文章标题

2015-07-05 11:11 387 查看
#include<iostream>
#include<stdio.h>
#include<string>
using namespace std;
class MapRect //空间范围
{
public:
double MaxY, MaxX, MinY, MinX;
};

class QuadNode  //节点
{
public:
MapRect Box;  //节点范围
int nChildCount; //孩子节点数
QuadNode *children[4]; //指向四个孩子节点指针数组
float NodeNum;
};
bool  CreateQuadNode(QuadNode * & node, float Count, float MaxX, float MinX, float MaxY, float MinY) //建立四叉树
{
node = new QuadNode(); //开辟新空间
node->NodeNum = Count;  //向空间内传送节点的个数
node->Box.MaxX = MaxX;
node->Box.MinX = MinX;
node->Box.MaxY = MaxY;
node->Box.MinY = MinY;
//cout << node->NodeNum<< endl;
if (Count<=4)
{
return true;
}
Count = Count / 4;
CreateQuadNode(node->children[0], Count, MaxX,(MinX + MaxX) / 2,MaxY,(MaxY + MinY) / 2);
CreateQuadNode(node->children[1], Count, (MinX + MaxX) / 2,MinX,MaxY,(MaxY + MinY) / 2);
CreateQuadNode(node->children[2], Count, (MinX + MaxX) / 2,MinX,(MaxY + MinY) / 2,MinY);
CreateQuadNode(node->children[3], Count, MaxX,(MinX + MaxX) / 2,(MaxY + MinY) / 2,MinY);
}
int CoutQuadNode(QuadNode *node, int(*visit)(float, float, float, float, float)) //递归先序遍历四叉树
{
if (node)
{
if (visit(node->NodeNum,node->Box.MaxX,node->Box.MinX,node->Box.MaxY,node->Box.MinY))
{
if (CoutQuadNode(node->children[0], visit))
{
if (CoutQuadNode(node->children[1], visit))
{
if (CoutQuadNode(node->children[2], visit))
{
if (CoutQuadNode(node->children[3], visit))
{
return 1;
}
}
}
}
}

}
else
return 1;
}
int Output(float n, float maxX, float minX, float maxY, float minY) //指向输出范围的函数
{
cout << n << endl;
cout << maxX << "," << minX << "," << maxY << "," << minY << endl;
return 1;
}
int main()
{
int(*p)(float,float, float, float, float ); //声明一个函数指针
int Output(float, float, float, float, float);//声明输出函数
p = Output;//将函数指针指向输出函数
QuadNode *root = new QuadNode();
CreateQuadNode(root, 20, 20, 10, 20, 10);
CoutQuadNode(root,p);
return 0;
}


这几行小代码可以实现四叉树的简单建立和遍历,都是采用了递归调用,遍历是先序遍历,并且只适合满二叉树。
其中CreateQuadNode(root, 20, 20, 10, 20, 10);中,第一个20是四叉树内总点的个数,后面的数分别是X的最大最小,Y的最大最小。由于递归遍历耗费太大,所以我将会采用非递归调用方式实现遍历。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: