在计算机图形学、游戏开发和地理信息系统中,如何高效地管理二维空间中的大量对象是一个常见问题。这时候,C语言四叉树实现就成为了一个非常实用的解决方案。本文将从零开始,手把手教你用C语言构建一个简单的四叉树,即使是编程小白也能轻松上手!
四叉树(Quadtree)是一种树形数据结构,用于对二维空间进行递归划分。每个内部节点都有恰好四个子节点,分别代表父区域的四个象限:西北(NW)、东北(NE)、西南(SW)和东南(SE)。

通过这种结构,我们可以快速判断哪些对象位于某个区域内,从而避免对所有对象进行遍历,极大提升性能。这也是四叉树数据结构的核心优势。
我们将分三步实现一个基础四叉树:
// 点结构typedef struct { double x; double y;} Point;// 边界矩形结构typedef struct { double x; // 中心x坐标 double y; // 中心y坐标 double width; // 宽度 double height; // 高度} Rectangle;#define MAX_POINTS 4 // 每个节点最多容纳4个点#define MAX_DEPTH 8 // 最大递归深度typedef struct QuadTree { Rectangle boundary; // 当前节点表示的区域 Point points[MAX_POINTS]; // 存储的点 int pointCount; // 当前点数量 struct QuadTree* children[4]; // 四个子节点:NW, NE, SW, SE int isDivided; // 是否已分割 int depth; // 当前深度} QuadTree;我们重点实现三个函数:quadtree_create(创建)、quadtree_insert(插入点)、quadtree_query(范围查询)。
// 创建四叉树QuadTree* quadtree_create(Rectangle boundary, int depth) { QuadTree* qt = (QuadTree*)malloc(sizeof(QuadTree)); qt->boundary = boundary; qt->pointCount = 0; qt->isDivided = 0; qt->depth = depth; for (int i = 0; i < 4; i++) { qt->children[i] = NULL; } return qt;}// 判断点是否在矩形内int rectangle_contains(Rectangle r, Point p) { return (p.x >= r.x - r.width / 2 && p.x <= r.x + r.width / 2 && p.y >= r.y - r.height / 2 && p.y <= r.y + r.height / 2);}// 插入点int quadtree_insert(QuadTree* qt, Point p) { // 如果点不在当前区域,返回失败 if (!rectangle_contains(qt->boundary, p)) { return 0; } // 如果还有空间且未分割,直接插入 if (qt->pointCount < MAX_POINTS && !qt->isDivided) { qt->points[qt->pointCount] = p; qt->pointCount++; return 1; } // 否则需要分割 if (!qt->isDivided && qt->depth < MAX_DEPTH) { double x = qt->boundary.x; double y = qt->boundary.y; double w = qt->boundary.width / 2; double h = qt->boundary.height / 2; Rectangle nw = {x - w/2, y - h/2, w, h}; Rectangle ne = {x + w/2, y - h/2, w, h}; Rectangle sw = {x - w/2, y + h/2, w, h}; Rectangle se = {x + w/2, y + h/2, w, h}; qt->children[0] = quadtree_create(nw, qt->depth + 1); qt->children[1] = quadtree_create(ne, qt->depth + 1); qt->children[2] = quadtree_create(sw, qt->depth + 1); qt->children[3] = quadtree_create(se, qt->depth + 1); qt->isDivided = 1; // 将原有所有点重新分配到子节点 for (int i = 0; i < qt->pointCount; i++) { for (int j = 0; j < 4; j++) { quadtree_insert(qt->children[j], qt->points[i]); } } qt->pointCount = 0; // 清空当前节点的点 } // 尝试插入到子节点 if (qt->isDivided) { for (int i = 0; i < 4; i++) { if (quadtree_insert(qt->children[i], p)) { return 1; } } } return 0;}#include <stdio.h>#include <stdlib.h>// ... 上面定义的所有结构和函数 ...int main() { // 创建根区域:中心(0,0),宽高均为200 Rectangle rootRect = {0, 0, 200, 200}; QuadTree* root = quadtree_create(rootRect, 0); // 插入一些随机点 Point points[] = {{10, 20}, {-30, 40}, {60, -10}, {0, 0}, {90, 90}}; int n = sizeof(points) / sizeof(points[0]); for (int i = 0; i < n; i++) { quadtree_insert(root, points[i]); } printf("四叉树构建完成!\n"); // 这里可以添加查询逻辑 // 注意:实际项目中需添加释放内存的函数 return 0;}通过本篇四叉树教程,你已经掌握了用C语言实现四叉树的基本方法。四叉树不仅能有效减少空间查询的复杂度,还能显著提升程序性能。虽然本文只实现了插入功能,但你可以在此基础上扩展查询、删除、可视化等功能。
记住,理解C语言四叉树实现的关键在于递归思想和空间划分逻辑。多动手写代码,你会越来越熟练!
提示:在实际项目中,请务必添加内存释放函数以避免内存泄漏。
本文由主机测评网于2025-12-06发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025123753.html