java非遞歸實(shí)現(xiàn)之二叉樹(shù)的前中后序遍歷詳解
二叉樹(shù)的前中后序遍歷
核心思想:用棧來(lái)實(shí)現(xiàn)對(duì)節(jié)點(diǎn)的存儲(chǔ)。一邊遍歷,一邊將節(jié)點(diǎn)入棧,在需要時(shí)將節(jié)點(diǎn)從棧中取出來(lái)并遍歷該節(jié)點(diǎn)的左子樹(shù)或者右子樹(shù),重復(fù)上述過(guò)程,當(dāng)棧為空時(shí),遍歷完成。
前序遍歷
//非遞歸 //根 左 右 class Solution { public List<Integer> preorderTraversal(TreeNode root) { //用數(shù)組來(lái)存儲(chǔ)前序遍歷結(jié)果 List<Integer> list = new ArrayList<>(); if(root==null) return list; //創(chuàng)建一個(gè)棧 Stack<TreeNode> st = new Stack<>(); //cur指向根節(jié)點(diǎn) TreeNode cur = root; while(!st.isEmpty()||cur!=null){ //一邊向左遍歷,一邊將遍歷到的節(jié)點(diǎn)入棧,節(jié)點(diǎn)值入數(shù)組 while(cur!=null){ list.add(cur.val); st.push(cur); //根 cur=cur.left; //左 } //指針指向棧頂節(jié)點(diǎn)(即上一個(gè)節(jié)點(diǎn)),并將棧頂節(jié)點(diǎn)出棧 cur = st.pop(); //指針指向該節(jié)點(diǎn)的右子樹(shù),開(kāi)始下一輪的遍歷 cur = cur.right; //右 } return list; } }
中序遍歷
//非遞歸 //左 根 右 class Solution { public List<Integer> inorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); if(root==null) return list; Stack<TreeNode> st = new Stack<>(); TreeNode cur = root; while(!st.isEmpty()||cur!=null){ //一邊向左遍歷,一邊將遍歷到的節(jié)點(diǎn)入棧 while(cur!=null){ st.push(cur); cur = cur.left; //左 } cur = st.pop(); //存儲(chǔ)遍歷結(jié)果 list.add(cur.val); //根 cur = cur.right; //右 } return list; } }
前序遍歷和中序遍歷的代碼基本相同,但是后序遍歷與它們不太一樣
后序遍歷
//非遞歸 //左 右 根 class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); if(root==null) return list; TreeNode cur = root; //關(guān)鍵在于定義一個(gè)cur的前驅(qū)節(jié)點(diǎn) TreeNode pre = null; Stack<TreeNode> st = new Stack<>(); while(cur!=null||!st.isEmpty()){ //一邊向左遍歷,一邊將遍歷到的節(jié)點(diǎn)入棧 while(cur!=null){ st.push(cur); cur = cur.left; } cur = st.pop(); //若該節(jié)點(diǎn)的右節(jié)點(diǎn)為空,或者右節(jié)點(diǎn)被遍歷過(guò),數(shù)組才能存儲(chǔ)該節(jié)點(diǎn)的數(shù)值(也就是我們最后才遍歷的根) if(cur.right==null||cur.right==pre){ list.add(cur.val); pre = cur; cur=null; }else{//如果不滿足,說(shuō)明該節(jié)點(diǎn)的右節(jié)點(diǎn)還沒(méi)有被遍歷過(guò),那么接著向右子節(jié)點(diǎn)遍歷 st.push(cur); cur=cur.right; } } return list; } }
到此這篇關(guān)于java非遞歸實(shí)現(xiàn)之二叉樹(shù)的前中后序遍歷詳解的文章就介紹到這了,更多相關(guān)Java 二叉樹(shù)遍歷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java 數(shù)據(jù)結(jié)構(gòu)中二叉樹(shù)前中后序遍歷非遞歸的具體實(shí)現(xiàn)詳解
- Java二叉樹(shù)的四種遍歷(遞歸與非遞歸)
- 通俗易懂講解C語(yǔ)言與Java中二叉樹(shù)的三種非遞歸遍歷方式
- java棧實(shí)現(xiàn)二叉樹(shù)的非遞歸遍歷的示例代碼
- Java二叉樹(shù)的四種遍歷(遞歸和非遞歸)
- JAVA二叉樹(shù)的幾種遍歷(遞歸,非遞歸)實(shí)現(xiàn)
- java二叉樹(shù)的幾種遍歷遞歸與非遞歸實(shí)現(xiàn)代碼
- java二叉樹(shù)的非遞歸遍歷
- Java實(shí)現(xiàn)的二叉樹(shù)常用操作【前序建樹(shù),前中后遞歸非遞歸遍歷及層序遍歷】
- Java開(kāi)發(fā)深入分析講解二叉樹(shù)的遞歸和非遞歸遍歷方法
相關(guān)文章
Jpa中Specification的求和sum不生效原理分析
這篇文章主要為大家介紹了Jpa中Specification的求和sum不生效原理示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08詳解通過(guò)maven運(yùn)行項(xiàng)目的兩種方式
這篇文章主要介紹了通過(guò)maven運(yùn)行項(xiàng)目的兩種方式,給大家提到了通過(guò)tomcat的方式來(lái)啟動(dòng)maven項(xiàng)目的方法,通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-12-12Shiro:自定義Realm實(shí)現(xiàn)權(quán)限管理方式
這篇文章主要介紹了Shiro:自定義Realm實(shí)現(xiàn)權(quán)限管理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Java實(shí)現(xiàn)整合文件上傳到FastDFS的方法詳細(xì)
FastDFS是一個(gè)開(kāi)源的輕量級(jí)分布式文件系統(tǒng),對(duì)文件進(jìn)行管理,功能包括:文件存儲(chǔ)、文件同步、文件上傳、文件下載等,解決了大容量存儲(chǔ)和負(fù)載均衡的問(wèn)題。本文將提供Java將文件上傳至FastDFS的示例代碼,需要的參考一下2022-02-02Java編程實(shí)現(xiàn)五子棋人人對(duì)戰(zhàn)代碼示例
這篇文章主要介紹了Java編程實(shí)現(xiàn)五子棋人人對(duì)戰(zhàn)代碼示例,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-11-11springboot 集成redission 以及分布式鎖的使用詳解
這篇文章主要介紹了springboot 集成redission 以及分布式鎖的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10Spring?Data?Elasticsearch?5.0.x修改數(shù)據(jù)后無(wú)法立即刷新解決方法示例
這篇文章主要為大家介紹了Spring?Data?Elasticsearch?5.0.x修改數(shù)據(jù)后無(wú)法立即刷新解決方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08詳解SpringMVC和MyBatis框架開(kāi)發(fā)環(huán)境搭建和簡(jiǎn)單實(shí)用
這篇文章主要介紹了詳解SpringMVC和MyBatis框架開(kāi)發(fā)環(huán)境搭建和簡(jiǎn)單實(shí)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05Java pom.xml parent引用報(bào)錯(cuò)問(wèn)題解決方案
這篇文章主要介紹了Java pom.xml parent引用報(bào)錯(cuò)問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08