四叉树递归遍历叶节点并输出至数组

原创 2012年03月29日 00:14:10
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#define  CHILD_NUM    4
typedef int Datatype;                // 节点数据类型
typedef struct QuadTree* ChildType;  // 指向孩子节点指针

int max_leaf_num = 1;                // 最大叶节点个数
static int N = 0;                    // 对叶节点计数的全局变量

// 四叉树节点结构
struct QuadTree
{
	Datatype   data;     // 数据
	ChildType  child[CHILD_NUM]; // 存放指向四个子树的指针数组
};

// 判断是否为叶节点,是返回1,不是返回0
int isLeaf( QuadTree* node )  
{
	int i;
	for ( i = 0; i < CHILD_NUM; ++i )
	{
		if ( node->child[i] != NULL ) // 如果存在子树,则不是叶节点
			return 0;
	}

	return 1;
}

// 将长度为n的数组空间扩大两倍
void expandArr( Datatype** out )
{
	int n = max_leaf_num;
	Datatype* tmpArr = (Datatype*)malloc( sizeof(Datatype) * n);
	memcpy( tmpArr, *out, sizeof(Datatype) * n);
	free(*out);

	*out = (Datatype*)malloc( sizeof(Datatype) * n * 2);
	memcpy( *out, tmpArr, sizeof(Datatype) * n );
	free( tmpArr );
	max_leaf_num = n * 2;
}

// 遍历四叉树,将叶节点数据存储到out所指的数组中
void __travels( QuadTree* root, Datatype** out )
{
	int i;

	if ( root == NULL )
		return;

	if ( isLeaf( root ) )
	{
		if ( N >= max_leaf_num ) // 如果数组空间不足
		{
			expandArr( out );   // 将数组空间扩大两倍
		}

		(*out)[N++] = root->data;
		return;
	}

	for ( i = 0; i < CHILD_NUM; ++i )
		__travels( root->child[i], out );
}

// 遍历,返回叶节点数目
int Travels( QuadTree* root, Datatype** out )
{
	N = 0;  // 全局变量,记录也节点个数
	__travels( root, out );
	return N;
}

// 初始化
QuadTree* InitTree()
{
	int i;

	QuadTree* root = (QuadTree*)malloc(sizeof(QuadTree));
	for ( i = 0; i < CHILD_NUM; ++i )
	{
		root->child[i] = NULL;
	}

	return root;
}

// 释放树空间
void ReleaseTree( QuadTree** root )
{
	int i;

	QuadTree* node = *root;
	if ( node == NULL ) 
		return;
	else
	{
		for ( i = 0; i < CHILD_NUM; ++i )
		{
			ReleaseTree( &(node->child[i]) );
		}
		free( node );
	}

	*root = NULL;
}

// 在root的第n个孩子处插入数据d
void InsertData( QuadTree* root, Datatype d, int n )
{
	int i;
	QuadTree* tmpNode = NULL;

	if ( n < 0 || n >= 4 || root == NULL )  // 如果n不为0,1,2,3或者root为空,这直接结束
		return;
	if ( root->child[n] != NULL )           // 如果root的第n个孩子节点已经有数据,则用d替换该数据
		root->child[n]->data = d;
	else                                    // 否则,分配一个新节点,该节点数据为d,让child[n]指向该节点
	{
		tmpNode = (QuadTree*)malloc(sizeof(QuadTree));
		for ( i = 0; i < CHILD_NUM; ++i )
		{
			tmpNode->child[i] = NULL;
		}
		tmpNode->data = d;

		root->child[n] = tmpNode;
	}
}

int main()
{
	int i;
	QuadTree* root = InitTree();
	root->data = 10;
	for ( i = 0; i < CHILD_NUM-1; ++i )
	{
		InsertData( root, i*i, i);
	}

	for ( i = 0; i < CHILD_NUM; ++i )
	{
		InsertData( root->child[0], root->data + i+2, i);
	}

	Datatype* leafData = (Datatype*)malloc( sizeof(Datatype) * max_leaf_num );
	  
	int K = Travels( root, &leafData );

	for ( int i = 0; i < K; ++i )
	{
		printf("%d\n", leafData[i] );
	}

	ReleaseTree( &root ); 

	return 0;
}

相关文章推荐

四叉树的前序,后序,层次遍历

//四叉树的前序,后序,层次遍历 #include #include #include using namespace std; typedef char datatype; typ...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

四叉树算法

title: 四叉树算法 date: 2016-1-11 15:10 categories: IOS tags: 算法 小小程序猿 我的博客:http://daycoding.com 转载:h...
  • coolwxb
  • coolwxb
  • 2016年03月05日 10:25
  • 5465

四叉树空间索引原理及其实现

四叉树索引的基本思想是将地理空间递归划分为不同层次的树结构。它将已知范围的空间等分成四个相等的子空间,如此递归下去,直至树的层次达到一定深度或者满足某种要求后停止分割。四叉树的结构比较简单,并且当空间...

四叉树空间索引原理及其实现 && 递归遍历叶节点并输出至数组

原文链接:http://blog.csdn.net/zhouxuguang236/article/details/12312099 四叉树索引的基本思想是将地理空间递归划分为不同层次的树结构。它...
  • wolf96
  • wolf96
  • 2015年07月06日 12:18
  • 1313

高德地图设置当前地图的经纬度范围

- (void)mapView:(MAMapView *)mapView didUpdateUserLocation:(MAUserLocation *)userLocation updatingLo...

Java数组实现循环队列的两种方法

用java实现循环队列的方法: 1、增加一个属性size用来记录目前的元素个数。目的是当head=rear的时候,通过size=0还是size=数组长度,来区分队列为空,或者队列已满。 2...

四叉树 动态节点解决方案

首先,我要假设你已经对一个空间完成了四叉树划分,并得到一棵树( root ),那么对于静态物体,很明显你只需要在预处理阶段一次性插入即可,并且在游戏运行阶段你都无须去关心它们( 除非你用一颗炸弹把它们...
  • Major_
  • Major_
  • 2012年03月31日 18:38
  • 2673

php 数据集转换树、递归重组节点信息多维数组

将数据集转换成树 /** * 将返回的数据集转换成树 * @param array $list 数据集 * @param string $pk 主键 * @param st...

算法导论第二版习题10.4-5.非递归有父节点中序遍历二叉树

1.二叉树有父节点。2.非递归不用栈,不能修改树的结构(临时也不行)。o(n)时间复杂度,o(1)空间复杂度中序遍历二叉树做法:用一个last指针和一个cur指针。主要是查看是0.是否已经回到访问完的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:四叉树递归遍历叶节点并输出至数组
举报原因:
原因补充:

(最多只允许输入30个字)