typedef struct BiTNode
{
    char data;
    struct BiTNode *lchild, *rchild; ///左右孩子
} BiTNode,*BiTree;

void PreOrder_Nonrecursive1(BiTree T) ///先序遍历的非递归
{
    if(!T)
        return ; ///如果结点为空,终止
    stack<BiTree> s; ///用栈存储
    BiTree curr = T; ///使用中间量传递数据
    while(curr != NULL || !s.empty())
    {
        while(curr != NULL) ///一直循环查找左结点
        {
            cout<<curr->data<<" ";
            s.push(curr);
            curr = curr->lchild;
        }
        if(!s.empty()) ///当左结点为空了,开始查找右结点
        {
            curr = s.top();
            s.pop();
            curr = curr->rchild;
        }
    }
}
void InOrderTraverse(BiTree T) /// 中序遍历的非递归
{
    if(!T)
        return ;
    stack<BiTree> s;
    BiTree curr = T->lchild; /// 先指向当前要检查的节点
    s.push(T);
    while(curr != NULL || !s.empty())
    {
        while(curr != NULL) /// 一直向左走
        {
            s.push(curr);
            curr = curr->lchild;
        }
        curr = s.top();
        s.pop();
        cout<<curr->data<<" ";
        curr = curr->rchild;
    }
}
void PostOrder_Nonrecursive(BiTree T) ///后序遍历的非递归 双栈法
{
    stack<BiTree> s1 , s2;
    BiTree curr ; /// 指向当前要检查的节点
    s1.push(T);
    while(!s1.empty()) /// 栈空时结束
    {
        curr = s1.top();
        s1.pop();
        s2.push(curr);
        if(curr->lchild)
            s1.push(curr->lchild);
        if(curr->rchild)
            s1.push(curr->rchild);
    }
    while(!s2.empty())
    {
        printf("%c ", s2.top()->data);
        s2.pop();
    }
}