Java 數(shù)據(jù)結(jié)構(gòu)中二叉樹前中后序遍歷非遞歸的具體實現(xiàn)詳解
一、前序遍歷
1.題目描述
給你二叉樹的根節(jié)點 root ,返回它節(jié)點值的 前序 遍歷。
2.輸入輸出示例
示例 1:

輸入:root = [1,null,2,3]
輸出:[1,2,3]
示例2:
輸入:root = []
輸出:[]
示例 3:
輸入:root = [1]
輸出:[1]
3.解題思路
前序遍歷:根結(jié)點—左子樹—右子樹

1.判斷額外情況,如果樹為空,直接返回
2.創(chuàng)建一個棧用來保存右子樹
3.先將根結(jié)點入棧,避免多次判斷棧為空
4.取出棧頂元素(第一次為根結(jié)點),從上往下遍歷最左側(cè)路徑中的每個結(jié)點
5.在遍歷時判斷當(dāng)前結(jié)點的右子樹是否為空,非空則入棧
6.遍歷結(jié)束后,此時棧頂元素為前一個結(jié)點的右子樹,將棧頂元素取出,將其看作一棵樹,繼續(xù)重復(fù)上述操作,即形成循環(huán)。
4.代碼實現(xiàn)
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<>();
if(root==null){
return list;
}
//創(chuàng)建一個棧用來保存右子樹
Stack<TreeNode> s=new Stack<>();
TreeNode cur=root;
s.push(root);
//從上往下遍歷最左側(cè)路徑中的每個結(jié)點,并將其右子樹保存起來---棧
while(!s.empty()||cur!=null){
cur=s.pop();
while(cur!=null){
list.add(cur.val);
if(cur.right!=null){
s.push(cur.right);
}
cur=cur.left;
}
}
return list;
}
}
二、中序遍歷
1.題目描述
給定一個二叉樹的根節(jié)點 root ,返回它的 中序 遍歷。
2.輸入輸出示例
示例 1:

輸入:root = [1,null,2,3]
輸出:[1,3,2]
示例 2:
輸入:root = []
輸出:[]
示例 3:
輸入:root = [1]
輸出:[1]
3.解題思路
中序遍歷:左子樹—根結(jié)點—右子樹

1.判斷額外情況,如果樹為空,直接返回
2.創(chuàng)建一個棧用來保存結(jié)點
3.從上往下遍歷最左側(cè)路徑中的每個結(jié)點,并將其保存到棧中,走到cur==null的位置
4.此時棧頂元素為最左側(cè)路徑的最后一個結(jié)點,將其加入到list并將棧頂元素移除
5.判斷最后一個結(jié)點的右子樹是否為空,過程和上述的過程是一樣的,直接將其右子樹看作一棵樹,整個過程便循環(huán)起來
4.代碼實現(xiàn)
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<>();
if(root==null){
return list;
}
Stack<TreeNode> s=new Stack<>();
TreeNode cur=root;
//從上往下遍歷最左側(cè)路徑中的每個結(jié)點,并將其保存到棧中
while(!s.empty()||cur!=null){
while(cur!=null){
s.push(cur);
cur=cur.left;
}
cur=s.pop();
list.add(cur.val);
cur=cur.right;
}
return list;
}
}
三、后序遍歷
1.題目描述
給定一個二叉樹,返回它的 后序 遍歷。
2.輸入輸出示例
示例:
輸入: [1,null,2,3]
1
\
2
/
3
輸出: [3,2,1]
3.解題思路
后序遍歷:左子樹—右子樹—根結(jié)點

1.判斷額外情況,如果樹為空,直接返回
2.創(chuàng)建一個棧用來保存遍歷的結(jié)點
3找出以cur為根的二叉樹中最左側(cè)的節(jié)點,并保存所經(jīng)路徑中的所有結(jié)點—棧
4.此時棧頂元素為最左側(cè)路徑的最后一個結(jié)點
5.先要判斷最后一個結(jié)點的右子樹是否為空
如果為空,直接將結(jié)點加入list,同時將棧頂元素刪除
如果不為空則將右子樹看作一棵樹,重新進(jìn)入循環(huán)判斷
注意:如果按照這樣,到了最后的右子樹就會一直循環(huán)出不來
解決方案:
創(chuàng)建一個prev用來標(biāo)記已經(jīng)遍歷過的結(jié)點,將能否編歷的條件改為:top的右子樹為空||top的右子樹已經(jīng)遍歷過
4.代碼實現(xiàn)
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list=new ArrayList<>();
if(root==null){
return list;
}
Stack<TreeNode> s=new Stack<>();
TreeNode cur=root;
TreeNode prev=null;//用來標(biāo)記剛剛遍歷過的節(jié)點
while(!s.empty()||cur!=null){
//1.找出以cur為根的二叉樹中最左側(cè)的節(jié)點,并保存所經(jīng)路徑中的所有節(jié)點---棧
while(cur!=null){
s.push(cur);
cur=cur.left;
}
TreeNode top=s.peek();
//top能否遍歷:top的右子樹為空||top的右子樹已經(jīng)遍歷過
if(top.right==null||top.right==prev){
list.add(top.val);
prev=top;
s.pop();
}else{
cur=top.right;
}
}
return list;
}
}
以上就是Java 數(shù)據(jù)結(jié)構(gòu)中二叉樹前中后序遍歷非遞歸的具體實現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于Java 數(shù)據(jù)結(jié)構(gòu)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java設(shè)計模式編程中的責(zé)任鏈模式使用示例
這篇文章主要介紹了Java設(shè)計模式編程中的責(zé)任鏈模式使用示例,責(zé)任鏈模式可以避免很多請求的發(fā)送者和接收者之間的耦合關(guān)系,需要的朋友可以參考下2016-05-05
IDEA 中創(chuàng)建Spring Data Jpa 項目的示例代碼
這篇文章主要介紹了IDEA 中創(chuàng)建Spring Data Jpa 項目的示例代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04
springboot mybatis里localdatetime序列化問題的解決
這篇文章主要介紹了springboot mybatis里localdatetime序列化問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
為什么 Java 8 中不需要 StringBuilder 拼接字符串
java8中,編輯器對“+”進(jìn)行了優(yōu)化,默認(rèn)使用StringBuilder進(jìn)行拼接,所以不用顯示的使用StringBuilder了,直接用“+”就可以了。下面我們來詳細(xì)了解一下2019-05-05
Spring?Boot?優(yōu)雅整合多數(shù)據(jù)源
這篇文章主要介紹了Spring?Boot?優(yōu)雅整合多數(shù)據(jù)源,多數(shù)據(jù)源就是在一個單一應(yīng)用中涉及到了兩個及以上的數(shù)據(jù)庫,更多相關(guān)內(nèi)容需要的小伙伴可以參考下面文章介紹2022-05-05
springboot+vue?若依項目在windows2008R2企業(yè)版部署流程分析
這篇文章主要介紹了springboot+vue?若依項目在windows2008R2企業(yè)版部署流程,本次使用jar包啟動后端,故而準(zhǔn)備打包后的jar文件,需要的朋友可以參考下2022-12-12
如何獲取MyBatis Plus執(zhí)行的完整的SQL語句
這篇文章主要介紹了如何獲取MyBatis Plus執(zhí)行的完整的SQL語句問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
使用ElasticSearch6.0快速實現(xiàn)全文搜索功能的示例代碼
本篇文章主要介紹了使用ElasticSearch6.0快速實現(xiàn)全文搜索功能,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-02-02

