您的位置:首页 > 理论基础 > 数据结构算法

标记入栈法,完全二叉树的前序遍历

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息