结构推理 请写出利用栈对二叉树进行先根次序周游的非递归算法。
【正确答案】(1)初步框架
   抽象类型及基本运算:用BNode表示结点的抽象类型,用BTree表示二叉树的抽象类型。
   二叉树的基本运算有3种。
   ·BNode leflChild(BNode p)
   返回p结点的左子女结点,当指定结点没有左子女时,返回一个特殊结点NULL。
   ·BNode rightChild(BNode p)
   返回p结点的右子女结点,当指定结点没有右子女时,返回一个特殊结点NULL。
   ·BNode parent(BNode p)
   返回p结点的父结点,当指定结点没有父结点时,返回一个特殊结点NULL。
   1)递归算法
   void PreOrder(BNode p){    /*先根周游以p为根的二叉树*/
       if(p==NULL) return;
       visit(p);
       preOrder(leftChild(p));
       preOrder(rightChild(p));
   }
   2)思路
   利用栈将上述递归算法转换为一个等价的非递归算法。
   3)非递归算法
   void nPreOrder(BNode p){    /*先根周游以p为根的二叉树*/
       Stack s;    /*栈元素的类型是BNode*/
       BNode c;
       if(p==NULL)return;
       s=createEmptyStack();
       push(s,p);
       while(!isEmptyStack(s)){    /*每当栈不空*/
           c=top(s);
           pop(s);    /*取栈顶,出栈*/
           if(c!=NULL){
               visit(c);    /*访问*/
               push(s,rightChild(c));  /*右子女(右子树的根结点)进栈*/
               push(s.leftChild(c));    /*左子女(左子树的根结点)进栈*/
           }
       }
   }
   (2)具体算法
   1)数据结构
   采用二叉树的链接表示,同时采用栈的顺序表示。
   typedefPBinTreeNode DataType;  /*栈元素的类型是PBinTreeNode*/
   struct SeqStack{
       DataType s[MAXNUM];
       intt;
   };
   typedef struct SeqStack*PSeqStack;
   2)算法
   将上述算法框架具体化,得到如下算法。
   void npreOrder btree(BinTree btree){    /*先根周游二叉树btree*/
       PSeqStack s:    /*栈元素的类型是PBinTreeNode*/
       PBinTreeNode c;
       if(btree==NULL)return;
       s=createEmpty Stack_seq();
       push_seq(s,btree);
       while(!isEmptyStack_seq(s)){    /*每当栈不空*/
           c=top_seq(s);
           pop_seq(s);    /*取栈顶,出栈*/
           if(c!=NULL){
               visit(c);    /*访问*/
               push_seq(s.c->rlink);    /*右子女(右子树的根结点)进栈*/
               push_seq(s.c->llink);    /*左子女(左子树的根结点)进栈*/
           }
       }
   }
   3)代价分析
   该算法对每个结点访问1次,时间代价为O(n),空间代价为O(h)。
【答案解析】