急求二叉树后序非递归遍历算法和非递归深度算法,要求不使用堆栈!可以使用数组,该如何解决

急求二叉树后序非递归遍历算法和非递归深度算法,要求不使用堆栈!!可以使用数组
各位大神显神通吧....我无力了
用c语言写

------解决方案--------------------
二叉树的一些操作(包括递归、非递归、层次遍历、复制、输出、求叶子节点、深度、节点算法等)

C/C++ code

#include <stdio.h>
#include <stdlib.h>
#include "head.h"
#define MAXLEN  100    //队列的最大长度

typedef char DataType ;  //定义二叉树结点数据域类型
typedef struct treenode{ //定义二叉树结点类型
    DataType data ;
    struct treenode *lchild, *rchild ; 
} BinTreeTp ;
typedef BinTreeTp *BinTreePtr ; //定义二叉树结点指针类型

/***********非递归遍历二叉树**************/
//先序遍历
void pre(BinTreePtr T)
{
 BinTreeTp *p,*stack[MAXLEN];
 int top=0;
 if (T!=NULL)
 {
  stack[top]=T;
  while(top>=0)
  {
   p=stack[top--];
   printf("%c",p->data);
   if (p->rchild!=NULL)
   {
    stack[++top]=p->rchild;
   }
   if (p->lchild!=NULL)
   {
    stack[++top]=p->lchild;
   }
  }

 }
 
}

//中序遍历
void middle(BinTreePtr bt)
{
    BinTreeTp *p=bt, *stack[MAXLEN]; //p表示当前结点,栈stack[]用来存储结点
    int top=0;
    
    if(p != NULL)
    {
        while(top >= 0)
        {
            if(p != NULL) //左孩子结点先入栈
            {
                stack[top++] = p; //当前结点入栈
                p = p->lchild; //寻找左孩子结点
            }
            else //找到最左边的孩子结点后
            {
                if(top == 0) //表示全部元素均已输出,结束输出
                    break;
                p = stack[--top];//栈顶元素出栈
                printf("%c", p->data); //输出该结点
    p = p->rchild; //处理其右孩子结点
            }
        }
    } 
 else
  printf("空树");
}

//建二叉树操作,本操作创建一个由先序顺序输入的字符组成的二叉树。
void CreatBinTree(BinTreePtr *T)
{
  DataType ch ;
  if ((ch = getchar()) == '#')
      *T = NULL ;
  else {
      *T = (BinTreeTp *)malloc(sizeof(BinTreeTp)) ;
      (*T)->data = ch ;
      CreatBinTree(&(*T)->lchild) ;
      CreatBinTree(&(*T)->rchild) ;
  }
}

//二叉树的复制
void copytree(BinTreePtr T,BinTreePtr *R)
{
 if (T != NULL)
 {
  *R=(BinTreeTp *)malloc(sizeof(BinTreeTp));
  (*R)->data=T->data;
  printf("%c",(*R)->data);
  copytree(T->lchild,&(*R)->lchild);
  copytree(T->rchild,&(*R)->rchild);
 }
 else
  (*R)=NULL;
}

/**************递归遍历*****************/
//先序遍历二叉树操作
void PreOrder(BinTreePtr T)
{
   if (T) {
    printf("%c", T->data) ;
    PreOrder(T->lchild) ;
      PreOrder(T->rchild) ;
   }
}

//中序遍历二叉树操作
void InOrder(BinTreePtr T)
{
   if (T) {
      InOrder(T->lchild) ;
      printf("%c", T->data) ;
      InOrder(T->rchild) ;
   }
}
//后序遍历二叉树操作
void PostOrder(BinTreePtr T)
{
   if (T) {
      PostOrder(T->lchild) ;
      PostOrder(T->rchild) ;
      printf("%c", T->data) ;
   }
}
//层次遍历二叉树操作
void LevelOrder(BinTreePtr T)
{
   //定义一个存放二叉树结点指针的队列,循环队列并少用一个空间
   BinTreeTp *queue[MAXLEN] ; 
   int front, rear ;  //定义队列的队头和队尾指针
   BinTreeTp *p ;  //定义待处理二叉树结点的指针

   front = rear = 0 ; //循环队列初始化
   p = T ; //指向根结点
   if ((rear + 1) % MAXLEN == front) return ; //队列满,返回
   rear = (rear + 1) % MAXLEN ;//否则入队列
   queue[rear] = p ;
   while (front != rear) {  //当队列非空时,执行循环
      front = (front + 1) % MAXLEN ; //修改队头指针
      p = queue[front] ; //从队头取得数据

      printf("%c", p->data) ;  //遍历
      if (p->lchild) { //如果左孩子指针不为空,则入队列
  if ((rear + 1) % MAXLEN == front) return ;
  rear = (rear + 1) % MAXLEN ;
  queue[rear] = p->lchild ;
      }
      if (p->rchild) { //如果右孩子指针不为空,则入队列
  if ((rear + 1) % MAXLEN == front) return ;
  rear = (rear + 1) % MAXLEN ;
  queue[rear] = p->rchild ;
      }
   }
}
//求二叉树的叶子结点个数
int leafNum(BinTreePtr T)
{
 static int num=0;
 if (T != NULL)
 {
  if (T->lchild==NULL&&T->rchild==NULL)
  {
   ++num;
  }
  else
  {
   leafNum(T->lchild);
   leafNum(T->rchild);
  }
 }
 return num;
}

//求二叉树深度(第一层为1)
int deeptree(BinTreePtr T)
{
 static int m=0,n=0,max=0;
 if (T != NULL)
 {
  n=deeptree(T->lchild);
  m=deeptree(T->rchild);
  if (m>n)
   max=m;
  else
   max=n;
  return max+1;
 }
 else 
 return 0;
}
//求二叉树所有的结点个数操作。采用后序遍历思想。如果二叉树为空,
//总结点个数为零;否则后序求出左子树总结点个数和后序求出
//右子树总结点个数,总结点个数为左右之和再加上1。
int CountTree(BinTreePtr T)
{
   int lnum, rnum ;
   if (!T) return 0 ;
   else {
      lnum = CountTree(T->lchild) ;
      rnum = CountTree(T->rchild) ;
      return lnum + rnum + 1 ;
   }
}


//主程序
void main(void)
{
   BinTreePtr T,R;
   printf("请以先序顺序输入要创建的二叉树:/n") ;
   CreatBinTree(&T) ;
   printf("叶子个数为%d,  总结点个数为%d", leafNum(T),CountTree(T)) ;
   printf("/n二叉树的深度:%d/n",deeptree(T));
   printf("********非递归遍历:********/n");
   printf("先序遍历:") ;
   pre(T);
   printf("/n中序遍历:") ;
   middle(T);
   printf("/n********递归遍历:********/n");
   printf("先序遍历:") ;
   PreOrder(T) ;  //先序遍历
   printf("/n中序遍历:") ;
   InOrder(T) ;  //中序遍历
   printf("/n后序遍历:") ;
   PostOrder(T) ;  //后序遍历
   printf("/n层次遍历:") ;
   LevelOrder(T) ; //层次遍历
   printf("/n二叉树的复制(并先序输出二叉树):");
   copytree(T,&R);
   printf("/n") ;
}