java非遞歸實(shí)現(xiàn)之二叉樹的前中后序遍歷詳解
二叉樹的前中后序遍歷
核心思想:用棧來(lái)實(shí)現(xiàn)對(duì)節(jié)點(diǎn)的存儲(chǔ)。一邊遍歷,一邊將節(jié)點(diǎn)入棧,在需要時(shí)將節(jié)點(diǎn)從棧中取出來(lái)并遍歷該節(jié)點(diǎn)的左子樹或者右子樹,重復(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)的右子樹,開始下一輪的遍歷
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)之二叉樹的前中后序遍歷詳解的文章就介紹到這了,更多相關(guān)Java 二叉樹遍歷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java 數(shù)據(jù)結(jié)構(gòu)中二叉樹前中后序遍歷非遞歸的具體實(shí)現(xiàn)詳解
- Java二叉樹的四種遍歷(遞歸與非遞歸)
- 通俗易懂講解C語(yǔ)言與Java中二叉樹的三種非遞歸遍歷方式
- java棧實(shí)現(xiàn)二叉樹的非遞歸遍歷的示例代碼
- Java二叉樹的四種遍歷(遞歸和非遞歸)
- JAVA二叉樹的幾種遍歷(遞歸,非遞歸)實(shí)現(xiàn)
- java二叉樹的幾種遍歷遞歸與非遞歸實(shí)現(xiàn)代碼
- java二叉樹的非遞歸遍歷
- Java實(shí)現(xiàn)的二叉樹常用操作【前序建樹,前中后遞歸非遞歸遍歷及層序遍歷】
- Java開發(fā)深入分析講解二叉樹的遞歸和非遞歸遍歷方法
相關(guān)文章
SpringBoot整合Guava Cache實(shí)現(xiàn)全局緩存的示例代碼
這篇文章主要介紹了SpringBoot整合Guava Cache實(shí)現(xiàn)全局緩存,Guava Cache是Google Guava庫(kù)中的一個(gè)模塊,提供了基于內(nèi)存的本地緩存實(shí)現(xiàn),文中介紹了SpringBoot整合使用Guava Cache的具體步驟,需要的朋友可以參考下2024-03-03
SpringBoot整合Jasypt實(shí)現(xiàn)配置加密的步驟詳解
Jasypt是一個(gè)Java庫(kù),提供了一種簡(jiǎn)單的加密解密方式,可用于保護(hù)敏感數(shù)據(jù),例如密碼、API密鑰和數(shù)據(jù)庫(kù)連接信息等,本文給大家介紹了SpringBoot整合Jasypt實(shí)現(xiàn)配置加密的詳細(xì)步驟,感興趣的同學(xué)可以參考一下2023-11-11
Java8 中使用Stream 讓List 轉(zhuǎn) Map使用問(wèn)題小結(jié)
這篇文章主要介紹了Java8 中使用Stream 讓List 轉(zhuǎn) Map使用總結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-06-06
Spring data jpa @Query update的坑及解決
這篇文章主要介紹了Spring data jpa @Query update的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
Java?8函數(shù)式接口之Consumer用法示例詳解
這篇文章主要為大家介紹了Java?8函數(shù)式接口之Consumer用法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
Springboot使用RestTemplate調(diào)用第三方接口的操作代碼
這篇文章主要介紹了Springboot使用RestTemplate調(diào)用第三方接口,我只演示了最常使用的請(qǐng)求方式get、post的簡(jiǎn)單使用方法,當(dāng)然RestTemplate的功能還有很多,感興趣的朋友可以參考RestTemplate源碼2022-12-12

