java非遞歸實現(xiàn)之二叉樹的前中后序遍歷詳解
二叉樹的前中后序遍歷
核心思想:用棧來實現(xiàn)對節(jié)點的存儲。一邊遍歷,一邊將節(jié)點入棧,在需要時將節(jié)點從棧中取出來并遍歷該節(jié)點的左子樹或者右子樹,重復上述過程,當棧為空時,遍歷完成。
前序遍歷
//非遞歸 //根 左 右 class Solution { public List<Integer> preorderTraversal(TreeNode root) { //用數(shù)組來存儲前序遍歷結果 List<Integer> list = new ArrayList<>(); if(root==null) return list; //創(chuàng)建一個棧 Stack<TreeNode> st = new Stack<>(); //cur指向根節(jié)點 TreeNode cur = root; while(!st.isEmpty()||cur!=null){ //一邊向左遍歷,一邊將遍歷到的節(jié)點入棧,節(jié)點值入數(shù)組 while(cur!=null){ list.add(cur.val); st.push(cur); //根 cur=cur.left; //左 } //指針指向棧頂節(jié)點(即上一個節(jié)點),并將棧頂節(jié)點出棧 cur = st.pop(); //指針指向該節(jié)點的右子樹,開始下一輪的遍歷 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é)點入棧 while(cur!=null){ st.push(cur); cur = cur.left; //左 } cur = st.pop(); //存儲遍歷結果 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; //關鍵在于定義一個cur的前驅節(jié)點 TreeNode pre = null; Stack<TreeNode> st = new Stack<>(); while(cur!=null||!st.isEmpty()){ //一邊向左遍歷,一邊將遍歷到的節(jié)點入棧 while(cur!=null){ st.push(cur); cur = cur.left; } cur = st.pop(); //若該節(jié)點的右節(jié)點為空,或者右節(jié)點被遍歷過,數(shù)組才能存儲該節(jié)點的數(shù)值(也就是我們最后才遍歷的根) if(cur.right==null||cur.right==pre){ list.add(cur.val); pre = cur; cur=null; }else{//如果不滿足,說明該節(jié)點的右節(jié)點還沒有被遍歷過,那么接著向右子節(jié)點遍歷 st.push(cur); cur=cur.right; } } return list; } }
到此這篇關于java非遞歸實現(xiàn)之二叉樹的前中后序遍歷詳解的文章就介紹到這了,更多相關Java 二叉樹遍歷內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Jpa中Specification的求和sum不生效原理分析
這篇文章主要為大家介紹了Jpa中Specification的求和sum不生效原理示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08Java實現(xiàn)整合文件上傳到FastDFS的方法詳細
FastDFS是一個開源的輕量級分布式文件系統(tǒng),對文件進行管理,功能包括:文件存儲、文件同步、文件上傳、文件下載等,解決了大容量存儲和負載均衡的問題。本文將提供Java將文件上傳至FastDFS的示例代碼,需要的參考一下2022-02-02Java編程實現(xiàn)五子棋人人對戰(zhàn)代碼示例
這篇文章主要介紹了Java編程實現(xiàn)五子棋人人對戰(zhàn)代碼示例,具有一定借鑒價值,需要的朋友可以參考下。2017-11-11springboot 集成redission 以及分布式鎖的使用詳解
這篇文章主要介紹了springboot 集成redission 以及分布式鎖的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10Spring?Data?Elasticsearch?5.0.x修改數(shù)據(jù)后無法立即刷新解決方法示例
這篇文章主要為大家介紹了Spring?Data?Elasticsearch?5.0.x修改數(shù)據(jù)后無法立即刷新解決方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08詳解SpringMVC和MyBatis框架開發(fā)環(huán)境搭建和簡單實用
這篇文章主要介紹了詳解SpringMVC和MyBatis框架開發(fā)環(huán)境搭建和簡單實用,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05