标记入栈法,完全二叉树的前序遍历
2013-12-25 11:21
260 查看
//////////////////////////////////////////////////////////////
//标记入栈,完全二叉树的前序遍历
//给定一个数据结构,按照树的遍历原则,我们不真正把树中的DATA 送入栈中,而是对它的DATA值做一个标记,只是
//将它的标记送入栈中,然后出栈,可以达到将其值入栈一样的效果,这样做的好处是,当数据值DATA很复杂时或者所占字节数很大的时候
//可以节省内存空间,调高程序的性能
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *pNext;
}STACK;
void push_head(STACK **pHead,int data)
{
STACK *temp = (STACK*)malloc(sizeof(STACK));
temp ->data = data;
temp ->pNext = (*pHead);
(*pHead) = temp;
}
int pop_head(STACK **pStackHead)
{
if(!(*pStackHead))
{
return -1;
}
else
{
STACK *temp = (*pStackHead);
int vTemp = temp ->data;
(*pStackHead) = (*pStackHead) ->pNext;
free(temp);
return vTemp;
}
}
///////////////////////////////////////////////////////////////////////////////////////
//RuZhan ()中我们定义了 一个栈,它有三个形参,第一个是为标记所开辟的栈,第二个是要操作的数组,
//第三个是所要访问的数组中的第几个值,数组的下标是从零开始的,把ID = 0传进参数,然后按照完全二叉树的
//性质,对标记所对应的元素值进栈
void RuZhan(STACK *pStackHead,int *Array,size_t nLength,int ID)
{
int i = 0;
while(true)
{
while(ID < nLength)
{
printf("%d ",ID);
push_head(&pStackHead,ID);
ID = 2*ID + 1 ;
}
ID = pop_head(&pStackHead);
if(-1 == ID)
{
break;
}
ID = 2*ID+ 2;
}
}
int main()
{
STACK *pStack = NULL;
int Array[10] = {1,2,3,4,5,6,7,8,9,10};
RuZhan(pStack,Array,10,0);
return 0;
}
//////////////////////////////////////////////////////////////
//标记入栈,完全二叉树的前序遍历
//给定一个数据结构,按照树的遍历原则,我们不真正把树中的DATA 送入栈中,而是对它的DATA值做一个标记,只是
//将它的标记送入栈中,然后出栈,可以达到将其值入栈一样的效果,这样做的好处是,当数据值DATA很复杂时或者所占字节数很大的时候
//可以节省内存空间,调高程序的性能
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{
int data;
struct Node *pNext;
}STACK;
void push_head(STACK **pHead,int data)
{
STACK *temp = (STACK*)malloc(sizeof(STACK));
temp ->data = data;
temp ->pNext = (*pHead);
(*pHead) = temp;
}
int pop_head(STACK **pStackHead)
{
if(!(*pStackHead))
{
return -1;
}
else
{
STACK *temp = (*pStackHead);
int vTemp = temp ->data;
(*pStackHead) = (*pStackHead) ->pNext;
free(temp);
return vTemp;
}
}
///////////////////////////////////////////////////////////////////////////////////////
//RuZhan ()中我们定义了 一个栈,它有三个形参,第一个是为标记所开辟的栈,第二个是要操作的数组,
//第三个是所要访问的数组中的第几个值,数组的下标是从零开始的,把ID = 0传进参数,然后按照完全二叉树的
//性质,对标记所对应的元素值进栈
void RuZhan(STACK *pStackHead,int *Array,size_t nLength,int ID)
{
int i = 0;
while(true)
{
while(ID < nLength)
{
printf("%d ",ID);
push_head(&pStackHead,ID);
ID = 2*ID + 1 ;
}
ID = pop_head(&pStackHead);
if(-1 == ID)
{
break;
}
ID = 2*ID+ 2;
}
}
int main()
{
STACK *pStack = NULL;
int Array[10] = {1,2,3,4,5,6,7,8,9,10};
RuZhan(pStack,Array,10,0);
return 0;
}
相关文章推荐
- 用C++实现的完全二叉树,实现前序遍历,中序遍历,后序遍历。
- 递归算法对完全二叉树的前序遍历(方法二)
- 完全二叉树的创建与前序遍历
- 去除HTML标记
- Arcsde报ora-29861: 域索引标记为loading/failed/unusable错误
- 使用自定义 WebLogic JSP 标记
- css 标记区域
- Word 2007 无法插入段落标记
- 【数据结构与算法】求完全二叉树节点的个数
- !无法在序列化时为XML空节点添加结束标记
- hdu Nightmare(BFS||DFS)(不标记的剪枝)
- php正则取img标记中alt src width heigh属性
- 百度地图API之百度地图退拽标记点获取经纬度的实现代码
- 1.3插件实例;移除当前乐谱的所有高亮标记
- 数据结构之判断一棵树是否为完全二叉树
- Watin Html标记与Class映射表
- ppt怎么不显示动画效果的标记,看上去好乱啊
- 标准和 JM 代码--根据firsttime的材料整理出自己需要的加了红色标记
- [线段树练习1] 线段统计 - 线段树懒标记
- [分享] HTML 标记一览; BIOS中英文对照表; 在“命令提示符”中用“Ping命令”轻松、快速地检测网络故障