文章标题
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的最大最小。由于递归遍历耗费太大,所以我将会采用非递归调用方式实现遍历。
相关文章推荐
- Compare Version Numbers
- oracle 中BETWEEN命令
- oracle coalesce函数
- 阿里移动技术峰会的一些体会 2015-07-04
- JAVA实验第二天
- 彩色图像上执行Mean Shift迭代搜索目标 ,维加权直方图 + 巴氏系数 + Mean Shift迭代
- div absolute 置中
- GitHub学习笔记
- mysql的分区技术详细介绍
- 高斯消元 POJ 1830 1222 1753
- 运行时间(Java版本)—转换毫秒到时分秒日期
- Perl语言编程>>学习笔记
- 有道词典
- 51NOD算法马拉松 最大值问题 离线预处理+set lower_bound
- android动画之android:interpolator属性使用
- Bloom Filter布隆过滤器
- 需求与用户故事
- Leetcode_228_Summary Ranges
- Lettcode_228_Summary Ranges
- ubuntu14.04 安装 bcm43142无线网卡