标签:返回 || data cout else htc empty 一个 二叉树
void PreOrder(BinTree bt) { stack<BinTree> astack; BinTreeNode * p; astack.push(bt); while(!astack.empty()) { p=astack.top(); astack.pop(); cout<<p->data<<" "; if(p->rightchild!=NULL) { astack.push(p->rightchild); } if(p->leftchild!=NULL) { astack.push(p->leftchild); } } }
void InOrder(BinTree bt) { stack<BinTree> astack; BinTree p; p=bt; if(p==NULL) { return; } astack.push(bt); p=p->leftchild; while(p||!astack.empty()) { while(p!=NULL)//沿着左支深入直至NULL { astack.push(p); p=p->leftchild; } p=astack.top();//逐个弹出,访问 astack.pop(); cout<<p->data<<" "; p=p->rightchild;//进入右支,下次的大循环,就在右支中向左深入 } }
void PostOrder(BinTree bt) { BinTree p=bt; stack<BinTree> astack; if(bt==NULL) { return ; } while(p!=NULL||!astack.empty()) { while(p!=NULL) { astack.push(p); p=p->leftchild?p->leftchild:p->rightchild;//如果左孩子非空,移向左孩子,否则移向右孩子 } //此处已到达最底层 p=astack.top(); astack.pop(); cout<<p->data<<" "; if(!astack.empty()&&(astack.top()->leftchild==p))//如果栈非空,并且刚刚访问的节点是左孩子 { p=astack.top()->rightchild;//移向右孩子,下次大循环就开始寻找这个节点最底层 } else//如果是右孩子,说明左孩子在上次就被处理 { p=NULL;//p赋为空,这样下次大循环中的第一个循环被掠过,相当于返回了上一层 } } }
标签:返回 || data cout else htc empty 一个 二叉树
原文地址:https://www.cnblogs.com/single-dont/p/11545226.html