import java.util.Stack;
public class BinaryTree<E> {
Node<E> root;
public BinaryTree(E item) {
super();
this.root = new Node<>(item);
}
/**
* 前序:中左右
*/
public void preOrder() {
System.out.println("前序遍歷");
Stack<Node<E>> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
Node<E> node = stack.pop();
System.out.print(node.item + " ");
if (node.rightChild != null) {
stack.push(node.rightChild);
}
if (node.leftChild != null) {
stack.push(node.leftChild);
}
}
System.out.println();
}
/**
* 中序:左中右 思路:壓入當(dāng)前節(jié)點(diǎn)尚骄,判斷左孩子是否為空穴肘, 若為空,則彈出該節(jié)點(diǎn)翼雀,并打印践付,并以右孩子為當(dāng)前節(jié)點(diǎn)悄蕾,重復(fù)操作拣凹;
* 若不為空问词,則以左孩子做當(dāng)前節(jié)點(diǎn)督函,重復(fù)操作
*
* 重復(fù)操作的意思是呢。激挪。辰狡。就是壓入堆棧,判斷左孩子是否為空垄分。搓译。。
*/
public void middleOrder() {
System.out.println("中序遍歷");
Stack<Node<E>> stack = new Stack<>();
Node<E> node = root;
while (node != null || !stack.isEmpty()) {
if (node != null) {
stack.push(node);
node = node.leftChild;
} else {
node = stack.pop();
System.out.print(node.item + " ");
node = node.rightChild;
}
}
System.out.println();
}
/**
* 后序:左右中 思路:前序遍歷是中左右锋喜,那么前序遍歷反一下些己,就是中右左豌鸡,再順序顛倒過來一下,就是左右中段标,就成了后序遍歷涯冠。
* 所以思路就是,左右顛倒進(jìn)行前序遍歷逼庞,將節(jié)點(diǎn)壓入新的棧里面蛇更,然后再遍歷新的棧的元素,就搞定了
*/
public void afterOrder() {
System.out.println("后序遍歷");
Stack<Node<E>> stack = new Stack<>();
Stack<Node<E>> stack2 = new Stack<>();
Node<E> node = root;
while (node != null || !stack.isEmpty()) {
if (node != null) {
stack.push(node);
stack2.push(node);
// System.out.print(node.item + " ");
node = node.rightChild;
} else {
node = stack.pop();
node = node.leftChild;
}
}
// System.out.println();
// System.out.println("這才是真的后序遍歷");
while (!stack2.isEmpty()) {
Node<E> n = stack2.pop();
System.out.print(n.item + " ");
}
System.out.println();
}
public void preOrder2() {
System.out.println("前序遍歷");
preOrder2(root);
System.out.println();
}
public void middleOrder2() {
System.out.println("中序遍歷");
middleOrder2(root);
System.out.println();
}
public void afterOrder2() {
System.out.println("后序遍歷");
afterOrder2(root);
System.out.println();
}
private void preOrder2(Node<E> node) {
if (node == null)
return;
System.out.print(node.item + " ");
preOrder2(node.leftChild);
preOrder2(node.rightChild);
}
private void middleOrder2(Node<E> node) {
if (node == null)
return;
middleOrder2(node.leftChild);
System.out.print(node.item + " ");
middleOrder2(node.rightChild);
}
private void afterOrder2(Node<E> node) {
if (node == null)
return;
afterOrder2(node.leftChild);
afterOrder2(node.rightChild);
System.out.print(node.item + " ");
}
private static class Node<E> {
E item;
Node<E> leftChild;
Node<E> rightChild;
public Node(E item) {
this.item = item;
}
}
/**
* A / \ B C / \ / \ D E F G / \ / H I J 期望結(jié)果: 前序(中左右):ABDHEICFGJ
* 中序(左中右):HDBEIAFCJG 后序(左右中):HDIEBFJGCA
*/
public static void main(String[] args) {
BinaryTree<String> tree = new BinaryTree<String>("A");
Node<String> nodeB = new Node<String>("B");
Node<String> nodeC = new Node<String>("C");
Node<String> nodeD = new Node<String>("D");
Node<String> nodeE = new Node<String>("E");
Node<String> nodeF = new Node<String>("F");
Node<String> nodeG = new Node<String>("G");
Node<String> nodeH = new Node<String>("H");
Node<String> nodeI = new Node<String>("I");
Node<String> nodeJ = new Node<String>("J");
tree.root.leftChild = nodeB;
tree.root.rightChild = nodeC;
nodeB.leftChild = nodeD;
nodeB.rightChild = nodeE;
nodeC.leftChild = nodeF;
nodeC.rightChild = nodeG;
nodeD.leftChild = nodeH;
nodeE.rightChild = nodeI;
nodeG.leftChild = nodeJ;
System.out.println("-----------遞歸實(shí)現(xiàn)------------");
tree.preOrder2();
tree.middleOrder2();
tree.afterOrder2();
System.out.println("-----------堆棧實(shí)現(xiàn)------------");
tree.preOrder();
tree.middleOrder();
tree.afterOrder();
}
}
二叉樹的前序后序中序遍歷
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門动知,熙熙樓的掌柜王于貴愁眉苦臉地迎上來皿伺,“玉大人,你說我怎么就攤上這事盒粮⊥遗福” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵丹皱,是天一觀的道長(zhǎng)脂男。 經(jīng)常有香客問我,道長(zhǎng)种呐,這世上最難降的妖魔是什么宰翅? 我笑而不...
- 正文 為了忘掉前任,我火速辦了婚禮爽室,結(jié)果婚禮上汁讼,老公的妹妹穿的比我還像新娘。我一直安慰自己阔墩,他們只是感情好嘿架,可當(dāng)我...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啸箫,像睡著了一般耸彪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上忘苛,一...
- 文/蒼蘭香墨 我猛地睜開眼汉形,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了倍阐?” 一聲冷哼從身側(cè)響起概疆,我...
- 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎峰搪,沒想到半個(gè)月后岔冀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡罢艾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了尽纽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咐蚯。...
- 正文 年R本政府宣布期奔,位于F島的核電站,受9級(jí)特大地震影響危尿,放射性物質(zhì)發(fā)生泄漏呐萌。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一谊娇、第九天 我趴在偏房一處隱蔽的房頂上張望肺孤。 院中可真熱鬧,春花似錦济欢、人聲如沸赠堵。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽茫叭。三九已至,卻和暖如春半等,著一層夾襖步出監(jiān)牢的瞬間揍愁,已是汗流浹背呐萨。 一陣腳步聲響...
- 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像烁登,于是被迫代替她去往敵國(guó)和親怯屉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 在前文數(shù)據(jù)結(jié)構(gòu):二叉樹的原理及java實(shí)現(xiàn)中羡儿,我們已經(jīng)了解了二叉樹的原理及二叉樹的三種遍歷方式,假設(shè)父節(jié)點(diǎn)是N是钥,左...
- 原文章已經(jīng)移動(dòng)到【二叉樹】非遞歸遍歷的通用算法:前序厨相、中序和后序
- 建立一顆二叉排序樹毁渗,并輸出它的前序践磅、中序、后序以及層次遍歷結(jié)果 輸入:56 9 1 5 8輸出:6 1 5 9 8...