二叉树的遍历(非递归方式)
生活随笔
收集整理的這篇文章主要介紹了
二叉树的遍历(非递归方式)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前序非遞歸遍歷(借用棧結構): ①將根節點入棧; ②判棧空,獲取棧頂元素輸出; ③判斷右子樹是否為空,再判斷左子樹是否為空,在回至②執行。 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);}}
} 中序非遞歸遍歷(借用棧結構): 先將根節點入棧 ①首先保存當前結點所有的左樹結點; ②當左樹為空時,獲取棧頂元素(最左子樹)輸出val; ③再訪問棧頂元素的右子樹(p=p->right),再回退到①。 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;//進入右支,下次的大循環,就在右支中向左深入
}
} 后序非遞歸遍歷(借用棧結構): ①判斷當前結點不為空,并且棧不空,然后將根節點左子樹所有節點壓棧。 ②獲取棧頂元素并pop(),判斷一下此時的棧頂元素的左子樹,是否是上一次pop出的元素(即“/”型,表示當前棧頂元素的右子樹還未遍歷,故又以當前棧頂元素的右子樹作為根節點),繼續執行①;若不滿足,則將其至NULL。 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賦為空,這樣下次大循環中的第一個循環被掠過,相當于返回了上一層
}}
}
轉載于:https://www.cnblogs.com/single-dont/p/11545226.html
總結
以上是生活随笔為你收集整理的二叉树的遍历(非递归方式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java常见的系统路径与获取方法
- 下一篇: 【感想文】感情经历,是否给你我带来的些许