java實(shí)現(xiàn)二叉樹(shù)遍歷的三種方式
本文實(shí)例為大家分享了java實(shí)現(xiàn)二叉樹(shù)遍歷的具體代碼,供大家參考,具體內(nèi)容如下
二叉樹(shù)如下:

遍歷結(jié)果如下:

以下是實(shí)現(xiàn)代碼:
package binTree;
import java.util.Stack;
/**
* @author bin.zhang
* @version 2017年8月29日 上午10:22:01
*/
public class BinTreeTraversal {
public static void main(String[] args) {
System.out.print("前序:");
Traversal.preOrder();
Traversal.preOrderRecursion(Traversal.createBinTree());
System.out.print("中序:");
Traversal.inOrder();
Traversal.inOrderRecursion(Traversal.createBinTree());
System.out.print("后序:");
Traversal.postOrder();
Traversal.postOrderRecursion(Traversal.createBinTree());
}
}
/**
* 節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)
*
* @author bin.zhang
* @version 2017年8月30日 上午11:49:38
*/
class BinTreeNode {
BinTreeNode() {
}
BinTreeNode(char data, int flag, BinTreeNode lchild, BinTreeNode rchild) {
this.data = data;
this.flag = flag;
this.lchild = lchild;
this.rchild = rchild;
}
char data;
int flag;
BinTreeNode lchild, rchild;
}
class Traversal {
/**
* 創(chuàng)建一棵二叉樹(shù)
*
* @author bin.zhang
* @return 根節(jié)點(diǎn)
*/
public static BinTreeNode createBinTree() {
BinTreeNode R3 = new BinTreeNode('F', 0, null, null);
BinTreeNode L2 = new BinTreeNode('D', 0, null, null);
BinTreeNode R2 = new BinTreeNode('E', 0, null, R3);
BinTreeNode L1 = new BinTreeNode('B', 0, L2, R2);
BinTreeNode R1 = new BinTreeNode('C', 0, null, null);
BinTreeNode T = new BinTreeNode('A', 0, L1, R1);
return T;
}
// 前序
public static void preOrder() {
BinTreeNode p = createBinTree();
Stack<BinTreeNode> stack = new Stack<BinTreeNode>();
while (p != null || !stack.empty()) {
if (p != null) {
System.out.print(p.data);
stack.push(p);
p = p.lchild;
}
else {
p = stack.pop();
p = p.rchild;
}
}
System.out.println();
}
// 前序遞歸
public static void preOrderRecursion(BinTreeNode top) {
if (top != null) {
System.out.println(top.data);
preOrderRecursion(top.lchild);
preOrderRecursion(top.rchild);
}
}
// 中序
public static void inOrder() {
BinTreeNode p = createBinTree();
Stack<BinTreeNode> stack = new Stack<BinTreeNode>();
while (p != null || !stack.empty()) {
if (p != null) {
stack.push(p);
p = p.lchild;
}
else {
p = stack.pop();
System.out.print(p.data);
p = p.rchild;
}
}
System.out.println();
}
// 中序遞歸
public static void inOrderRecursion(BinTreeNode top) {
if (top != null) {
inOrderRecursion(top.lchild);
System.out.println(top.data);
inOrderRecursion(top.rchild);
}
}
// 后序
public static void postOrder() {
BinTreeNode p = createBinTree();
Stack<BinTreeNode> stack = new Stack<BinTreeNode>(); // 初始化棧
int mark = 1; // 轉(zhuǎn)向標(biāo)志
while (p != null || !stack.empty()) { // 遍歷
if (p != null && mark != 0) {
stack.push(p);
p = p.lchild;
}// 轉(zhuǎn)向左子樹(shù)
else {
p = stack.pop();
p.flag++; // 退棧
if (p.flag == 1) {
stack.push(p);
p = p.rchild;
mark = 1;
} // 轉(zhuǎn)向右子樹(shù)
else if (p.flag == 2 && !stack.empty()) { // 輸出結(jié)點(diǎn)
System.out.print(p.data);
mark = 0;
}
else if (p.flag == 2 && stack.empty()) { // 輸出根結(jié)點(diǎn)并退出
System.out.print(p.data);
break;
}
} // if-else
} // while
System.out.println();
}
// 后序遞歸
public static void postOrderRecursion(BinTreeNode top) {
if (top != null) {
postOrderRecursion(top.lchild);
postOrderRecursion(top.rchild);
System.out.println(top.data);
}
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 圖解二叉樹(shù)的三種遍歷方式及java實(shí)現(xiàn)代碼
- 圖解紅黑樹(shù)及Java進(jìn)行紅黑二叉樹(shù)遍歷的方法
- java實(shí)現(xiàn)二叉樹(shù)的創(chuàng)建及5種遍歷方法(總結(jié))
- Java實(shí)現(xiàn)二叉樹(shù)的深度優(yōu)先遍歷和廣度優(yōu)先遍歷算法示例
- Java中二叉樹(shù)數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)示例
- Java實(shí)現(xiàn)求二叉樹(shù)的深度和寬度
- Java實(shí)現(xiàn)打印二叉樹(shù)所有路徑的方法
- java使用歸并刪除法刪除二叉樹(shù)中節(jié)點(diǎn)的方法
- JAVA 實(shí)現(xiàn)二叉樹(shù)(鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu))
- 一篇文章徹底弄懂Java中二叉樹(shù)
相關(guān)文章
SpringBoot整合MyBatis和MyBatis-Plus請(qǐng)求后不打印sql日志的問(wèn)題解決
本文主要介紹了SpringBoot整合MyBatis和MyBatis-Plus請(qǐng)求后不打印sql日志的問(wèn)題解決文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
Spring Data JPA開(kāi)啟批量更新時(shí)樂(lè)觀鎖失效問(wèn)題的解決方法
樂(lè)觀鎖的基本思想是,認(rèn)為在大多數(shù)情況下,數(shù)據(jù)訪問(wèn)不會(huì)導(dǎo)致沖突,因此,樂(lè)觀鎖允許多個(gè)事務(wù)同時(shí)讀取和修改相同的數(shù)據(jù),而不進(jìn)行顯式的鎖定,本文給大家介紹了Spring Data JPA開(kāi)啟批量更新時(shí)樂(lè)觀鎖失效問(wèn)題的解決方法,需要的朋友可以參考下2024-07-07
java json字符串轉(zhuǎn)JSONObject和JSONArray以及取值的實(shí)例
這篇文章主要介紹了java json字符串轉(zhuǎn)JSONObject和JSONArray以及取值的實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-05-05
Java中通過(guò)jsch來(lái)連接遠(yuǎn)程服務(wù)器執(zhí)行l(wèi)inux命令
這篇文章主要介紹了Java中通過(guò)jsch來(lái)連接遠(yuǎn)程服務(wù)器執(zhí)行l(wèi)inux命令的相關(guān)資料,需要的朋友可以參考下2016-03-03
MyBatis主鍵生成策略中useGeneratedKeys和<selectKey>的區(qū)別
本文主要介紹了MyBatis主鍵生成策略中useGeneratedKeys和<selectKey>的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
Jpa使用Page和Pageable分頁(yè)遇到的問(wèn)題及解決
這篇文章主要介紹了Jpa使用Page和Pageable分頁(yè)遇到的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
Spring jpa和mybatis整合遇到的問(wèn)題解析
有朋友說(shuō)jpa相比mybatis太難用,多表聯(lián)合的查詢寫起來(lái)也比較費(fèi)勁,所以便加入了mybatis的支持,在配置jpa時(shí)遇到各種問(wèn)題,需要修改相關(guān)配置文件,下面小編給大家分享下修改配置文件的思路,感興趣的朋友參考下2016-10-10

