二叉樹的後序遍歷非遞迴演算法
阿新 • • 發佈:2019-01-30
非遞迴思想:
由後序的 左右根 的順序來,不過二叉樹的定義本身就是一個遞迴的思想,只需要在對一個結點訪問之前先將該結點放入到棧中去,並依次將該結點的左孩子也放入到棧中
任意一個結點N,只要他有左孩子,則在N入棧之後,N的左孩子必然也跟著入棧了
每次入棧之後都會判斷迴圈體,這個p是否為空,以及棧是否為空,如果p不為空就會繼續入棧,當p為空棧不為空就開始出棧操作,直到p為空,棧也為空,說明已經遍歷完了
非遞迴程式碼如下:(這個也是非遞迴的一種演算法,還有其他形式)
void PostOrder(BiTree){ InitStack(S); p = T;//用P來指向樹的根結點 r = NULL;//用一個r結點來標記剛剛被訪問過的結點,在遍歷右子樹時做一個判斷 while(p||!isEmpty(S){ if(p){ push(S,p);//將p結點壓入到棧中 p = p->lchild;//每次都會先將左孩子給 } else{ GetTop(S,p);//讀取棧頂元素,用P返回 if(p->rchild&&p->rchild!=r){ //如果有右子樹並且沒有右子樹沒有被訪問過向右走 p = p->rchild; push(S,p); p=p->lchild; } else{ pop(S,p);//出棧 visit(p->data);//訪問該結點的資料域 r = p; p = NULL;//用於迴歸根節點 } } } }