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

原创 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;
}

c语言实现二叉树先序,中序,后序(递归),层次遍历,求叶子节点个数及树的深度,下一篇写非递归的遍历

#include #include #define MAXSIZE 30 typedef char ElemType; typedef struct TNode *BiTree; stru...
  • u014574317
  • u014574317
  • 2017年04月04日 14:50
  • 1401

C++实现——二叉树的四种遍历(非递归写法)

#include #include #include #include using namespace std;//结构体定义如下 typedef struct TreeNode{ //...
  • langmanqishizaijia
  • langmanqishizaijia
  • 2016年04月09日 19:27
  • 2265

重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现

读完本文你将了解到: 什么是二叉树 Binary Tree 两种特殊的二叉树 满二叉树 完全二叉树 满二叉树 和 完全二叉树 的对比图 二叉树的实现 用 递归节点实现法左右链表示法 表示一个二叉树节点...
  • u011240877
  • u011240877
  • 2016年11月17日 02:03
  • 6844

四叉树 动态节点解决方案

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

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

将数据集转换成树 /** * 将返回的数据集转换成树 * @param array $list 数据集 * @param string $pk 主键 * @param st...
  • u012717614
  • u012717614
  • 2017年03月08日 15:01
  • 1579

非递归无栈无父节点中序遍历二叉树

好东东。灵感来源于线索二叉树 /** * Definition for binary tree * struct TreeNode { * int val; * ...
  • lylittle
  • lylittle
  • 2013年06月05日 08:43
  • 330

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

1.二叉树有父节点。2.非递归不用栈,不能修改树的结构(临时也不行)。o(n)时间复杂度,o(1)空间复杂度中序遍历二叉树做法:用一个last指针和一个cur指针。主要是查看是0.是否已经回到访问完的...
  • lylittle
  • lylittle
  • 2013年06月05日 05:50
  • 445

三维地形绘制--四叉树递归算法

  • 2011年10月14日 11:11
  • 31KB
  • 下载

变形二叉树中节点的最大距离(树的最长路径)——非递归解法

问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。  写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。测试用的树:    ...
  • hgqqtql
  • hgqqtql
  • 2014年10月04日 01:16
  • 1343

二叉树系列(建树,前序,中序,后序,中序非递归,深度,叶子数,节点数)

二叉树                                          a                                      /       \       ...
  • DouBoomFly
  • DouBoomFly
  • 2017年05月01日 17:37
  • 220
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:四叉树递归遍历叶节点并输出至数组
举报原因:
原因补充:

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