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)文章
JAVA中的deflate壓縮實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇JAVA中的deflate壓縮實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-09-09
SpringBoot整合mybatis-generator-maven-plugin的方法
這篇文章主要介紹了SpringBoot整合mybatis-generator-maven-plugin,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
java判斷中文字符串長(zhǎng)度的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇java判斷中文字符串長(zhǎng)度的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01
深入淺出講解Java比較器及數(shù)學(xué)常用類(lèi)
這篇文章主要介紹了深入淺出講解Java比較器及數(shù)學(xué)常用類(lèi),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
JAVA 并發(fā)容器的一些易出錯(cuò)點(diǎn)你知道嗎
今天給大家?guī)?lái)的文章是Java并發(fā)編程的相關(guān)知識(shí),文中對(duì)java同步容器與并發(fā)容器做了非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-09-09

