先序遍歷的非遞歸算法循環條件?
InitStack(S)
;//初始化棧 p=T;//取棧頂 while(P||!StackEmpty(S)){ //P存在或者棧非空 if(p) { //p非空,即左子樹或者右子樹存在 Push(S,p)
; //將左子樹入棧 p=p->lchild; //取下一個左子樹 } else{ Pop(S,p)
; //出棧,相當于先序遍歷了,因為左子樹都TMD入棧了,現在反向輸出 p=p->rchild; //彈出一個左子樹,就同時取其右子樹右子樹,然后又跳到這個if的最開頭那里,p存在的那個分支。
接下來再取右子樹的左子樹 } } //其實,用遞歸也許你更能理解一些。但是,遞歸本質上也是壓棧,只不過是程序壓棧,還不如這個效率高