日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二叉树的遍历(非递归方式)

發(fā)布時間:2024/1/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树的遍历(非递归方式) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
前序非遞歸遍歷(借用棧結(jié)構(gòu)): ①將根節(jié)點入棧; ②判棧空,獲取棧頂元素輸出; ③判斷右子樹是否為空,再判斷左子樹是否為空,在回至②執(zhí)行。 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);}} } 中序非遞歸遍歷(借用棧結(jié)構(gòu)): 先將根節(jié)點入棧 ①首先保存當(dāng)前結(jié)點所有的左樹結(jié)點; ②當(dāng)左樹為空時,獲取棧頂元素(最左子樹)輸出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;//進入右支,下次的大循環(huán),就在右支中向左深入 } } 后序非遞歸遍歷(借用棧結(jié)構(gòu)): ①判斷當(dāng)前結(jié)點不為空,并且棧不空,然后將根節(jié)點左子樹所有節(jié)點壓棧。 ②獲取棧頂元素并pop(),判斷一下此時的棧頂元素的左子樹,是否是上一次pop出的元素(即“/”型,表示當(dāng)前棧頂元素的右子樹還未遍歷,故又以當(dāng)前棧頂元素的右子樹作為根節(jié)點),繼續(xù)執(zhí)行①;若不滿足,則將其至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;//如果左孩子非空,移向左孩子,否則移向右孩子 }//此處已到達(dá)最底層 p=astack.top();astack.pop();cout<<p->data<<" ";if(!astack.empty()&&(astack.top()->leftchild==p))//如果棧非空,并且剛剛訪問的節(jié)點是左孩子 {p=astack.top()->rightchild;//移向右孩子,下次大循環(huán)就開始尋找這個節(jié)點最底層 }else//如果是右孩子,說明左孩子在上次就被處理 {p=NULL;//p賦為空,這樣下次大循環(huán)中的第一個循環(huán)被掠過,相當(dāng)于返回了上一層 }} }

轉(zhuǎn)載于:https://www.cnblogs.com/single-dont/p/11545226.html

總結(jié)

以上是生活随笔為你收集整理的二叉树的遍历(非递归方式)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。