Java中二叉樹(shù)的先序、中序、后序遍歷以及代碼實(shí)現(xiàn)
一、二叉樹(shù)的三種遍歷方式
二叉樹(shù)的遍歷主要有三種:先(根)序遍歷(根左右),中(根)序遍歷(左根右),后(根)序遍歷(左右根),以下圖為例分別說(shuō)明。

1、先(根)序遍歷(根左右)
先序遍歷的原則是:先根、再左、再右。 即:ABCDEFGH
2、中(根)序遍歷(左根右)
中序遍歷的原則是:先左、再根、再右。 即:BDCEAFHG
3、后(根)序遍歷(左右根)
后序遍歷的原則是:先左、再右、再根。 即:DECBHGFA
二、代碼實(shí)現(xiàn)二叉樹(shù)的三種遍歷方式
/**
* 下文中用到的TreeNode類(lèi)
*/
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
}
1、遞歸方式實(shí)現(xiàn)
/**
* 先序遍歷的原則是:先根、再左、再右。
* @param root
* @param list
*/
private void preorder(TreeNode root, List<Integer> list){
if(root != null){
list.add(root.val);
preorder(root.left,list);
preorder(root.right,list);
}
}
/**
* 中序遍歷的原則是:先左、再根、再右
* @param root
* @param list
*/
private void inorder(TreeNode root, List<Integer> list){
if(root != null){
inorder(root.left,list);
list.add(root.val);
inorder(root.right,list);
}
}
/**
* 后序遍歷的原則是:先左、再右、再根
* @param root
* @param list
*/
private void postorder(TreeNode root, List<Integer> list){
if(root != null){
postorder(root.left,list);
postorder(root.right,list);
list.add(root.val);
}
}
2、迭代方式實(shí)現(xiàn)
/**
* 先序遍歷的原則是:先根、再左、再右。
* 1.輔助變量 tempNode 初始化為根節(jié)點(diǎn)
* 2.當(dāng) tempNode != null 時(shí),就保存這個(gè)節(jié)點(diǎn)值到 list 中,然后將其入棧并置 tempNode為它自己的左子節(jié)點(diǎn)
* 3.當(dāng) tempNode == null 時(shí),說(shuō)明已經(jīng)遍歷到二叉樹(shù)的左下節(jié)點(diǎn)了,這時(shí)前序遍歷應(yīng)該遍歷右子樹(shù)了,首先 pop 出已經(jīng)遍歷保存過(guò)的父節(jié)點(diǎn),然后置 tempNode 為 pop 出的父節(jié)點(diǎn)的右子節(jié)點(diǎn)
* @param root
* @param list
*/
private void preorder(TreeNode root, List<Integer> list){
Stack<TreeNode> stack = new Stack<>();
TreeNode tempNode = root;
while(!stack.isEmpty() || tempNode != null){
if (tempNode != null) {
list.add(tempNode.val);
stack.push(tempNode);
tempNode = tempNode.left;
} else {
tempNode = stack.pop();
tempNode = tempNode.right;
}
}
}
/**
* 中序遍歷的原則是:先左、再根、再右
* 1.輔助變量 tempNode 初始化 root
* 3.當(dāng)棧非空或 tempNode 非 null 時(shí),循環(huán)
* 3.1 tempNode != null 時(shí),說(shuō)明還有左子節(jié)點(diǎn)存在,將 tempNode 入棧,并且將 tempNode 置為它自己的左子節(jié)點(diǎn)
* (和前序遍歷的區(qū)別在于這里遍歷到先不保存到 list 中,出棧的時(shí)候再將其保存到 list 中)
* 3.2 tempNode == null 時(shí),說(shuō)明到二叉樹(shù)左下的節(jié)點(diǎn)了,這時(shí)棧頂?shù)母腹?jié)點(diǎn)出棧賦值給 tempNode ,并保存節(jié)點(diǎn)值到 list ,將 tempNode 置為棧頂節(jié)點(diǎn)的右子節(jié)點(diǎn)繼續(xù)循環(huán)
* @param root
* @param list
*/
private void inorder(TreeNode root, List<Integer> list){
Stack<TreeNode> stack = new Stack<>();
TreeNode tempNode = root;
while(!stack.isEmpty() || tempNode != null){
if (tempNode != null) {
stack.push(tempNode);
tempNode = tempNode.left;
} else {
tempNode = stack.pop();
list.add(tempNode.val);
tempNode = tempNode.right;
}
}
}
/**
* 后序遍歷的原則是:先左、再右、再根
* 1.對(duì)應(yīng)前序遍歷的反操作:
* 2.前序遍歷從尾部添加元素,后序遍歷從頭部添加元素
* 3.前序遍歷去左子樹(shù),后序遍歷去右子樹(shù)
* @param root
* @param list
*/
private void postorder(TreeNode root, List<Integer> list){
Stack<TreeNode> stack = new Stack<>();
TreeNode tempNode = root;
while (!stack.isEmpty() || tempNode != null) {
if (tempNode != null) {
stack.push(tempNode);
list.add(0, tempNode.val);
tempNode = tempNode.right;
} else {
tempNode = stack.pop();
tempNode = tempNode.left;
}
}
}
到此這篇關(guān)于Java中二叉樹(shù)的先序、中序、后序遍歷以及代碼實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java二叉樹(shù)的先序、中序、后序遍歷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中實(shí)現(xiàn)二叉樹(shù)的遍歷與重構(gòu)
- 學(xué)習(xí)Java之二叉樹(shù)的編碼實(shí)現(xiàn)過(guò)程詳解
- 關(guān)于Java的二叉樹(shù)、紅黑樹(shù)、B+樹(shù)詳解
- Java實(shí)現(xiàn)多叉樹(shù)和二叉樹(shù)之間的互轉(zhuǎn)
- Java Morris遍歷算法及其在二叉樹(shù)中的應(yīng)用
- Java數(shù)據(jù)結(jié)構(gòu)之樹(shù)和二叉樹(shù)的相關(guān)資料
- java面試題解LeetCode27二叉樹(shù)的鏡像實(shí)例
- Java二叉樹(shù)中LCA問(wèn)題解決方法兩則
相關(guān)文章
WeakHashMap?和?HashMap?區(qū)別及使用場(chǎng)景
這篇文章主要為大家介紹了WeakHashMap?和?HashMap?的區(qū)別是什么以及何時(shí)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Linux中使用shell腳本管理Java應(yīng)用程序
在日常開(kāi)發(fā)和運(yùn)維工作中,管理基于Java的應(yīng)用程序是一項(xiàng)基礎(chǔ)且頻繁的任務(wù),本文將通過(guò)一個(gè)示例腳本,展示如何利用Shell腳本簡(jiǎn)化這一流程,實(shí)現(xiàn)Java應(yīng)用的一鍵式啟動(dòng)、停止與重啟操作,本腳本不僅提升了工作效率,還確保了操作的標(biāo)準(zhǔn)化與可靠性2024-06-06
Fluent Mybatis,原生Mybatis,Mybatis Plus三者功能對(duì)比
本文主要介紹了Fluent Mybatis,原生Mybatis,Mybatis Plus三者功能對(duì)比,分享給大家,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Java如何通過(guò)反射機(jī)制獲取數(shù)據(jù)類(lèi)對(duì)象的屬性及方法
文章介紹了如何使用Java反射機(jī)制獲取類(lèi)對(duì)象的所有屬性及其對(duì)應(yīng)的get、set方法,以及如何通過(guò)反射機(jī)制實(shí)現(xiàn)類(lèi)對(duì)象的實(shí)例化,感興趣的朋友跟隨小編一起看看吧2025-01-01
Springboot文件上傳功能簡(jiǎn)單測(cè)試
這篇文章主要介紹了Springboot文件上傳功能簡(jiǎn)單測(cè)試,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
Struts2學(xué)習(xí)筆記(1)-入門(mén)教程
本文是一個(gè)Struts2的簡(jiǎn)單入門(mén)教程,比較簡(jiǎn)單,希望能給大家做一個(gè)參考。2016-06-06
使用Java的Graphics類(lèi)進(jìn)行繪圖的方法詳解
這篇文章主要介紹了使用Java的Graphics類(lèi)進(jìn)行繪圖的方法,是Java的GUI編程的基礎(chǔ),需要的朋友可以參考下2015-10-10

