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



//
//标记入栈,完全二叉树的前序遍历
//给定一个数据结构,按照树的遍历原则,我们不真正把树中的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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值