import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
import java.util.LinkedList;
public class MainTra {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
int[] arr = Arrays.stream(str.split(" ")).mapToInt(Integer::valueOf).toArray();
Solution so = new Solution();
TreeNode root = so.creatTree(arr,0);
ArrayList<Integer> res = so.postTraver(root);
for(int i=0;i<res.size();i++) {
System.out.print(res.get(i)+" ");
}
System.out.println(System.lineSeparator());
}
}
/****
* 思想:構(gòu)建樹(shù)的時(shí)候,加入isVisit屬性,全部默認(rèn)為false;
* 先添加root節(jié)點(diǎn)進(jìn)棧;
* 執(zhí)行while循環(huán):(1)彈出棧頂節(jié)點(diǎn)node;(2)如果visit==true;則添加進(jìn)入結(jié)果,回到while循環(huán);
* 否則,增加入棧,遵循返過(guò)來(lái)的順序和判空,當(dāng)前節(jié)點(diǎn)的visit賦予true。
*/
class Solution {
// 先序遍歷
public ArrayList<Integer> preTraver(TreeNode root) {
ArrayList<Integer> res = new ArrayList<>();
LinkedList<TreeNode> stack = new LinkedList<>();
stack.add(root);
while(stack.size()>0) {
TreeNode node = stack.pollLast();
if(node.isVisit) {
res.add(node.val);
}else { //=============================preTraver(模板,唯一差別部分)======
// 先序遍歷(根左右)進(jìn)棧:右左根的非空元素依次進(jìn)去
if(node.right!=null) {
stack.add(node.right);
}
if(node.left!=null) {
stack.add(node.left);
}
node.isVisit = true;
stack.add(node);
}//==========================================================================
}
return res;
}
// 中序遍歷
public ArrayList<Integer> inTraver(TreeNode root) {
ArrayList<Integer> res = new ArrayList<>();
LinkedList<TreeNode> stack = new LinkedList<>();
stack.add(root);
while(stack.size()>0) {
TreeNode node = stack.pollLast();
if(node.isVisit) {
res.add(node.val);
}else {
// 中序遍歷(左根右)進(jìn)棧:右根左的非空元素依次進(jìn)去
if(node.right!=null) {
stack.add(node.right);
}
node.isVisit = true;
stack.add(node);
if(node.left!=null) {
stack.add(node.left);
}
}
}
return res;
}
// 后序遍歷
public ArrayList<Integer> postTraver(TreeNode root) {
ArrayList<Integer> res = new ArrayList<>();
LinkedList<TreeNode> stack = new LinkedList<>();
stack.add(root);
while(stack.size()>0) {
TreeNode node = stack.pollLast();
if(node.isVisit) {
res.add(node.val);
}else {
// 后序遍歷(左右根)進(jìn)棧:根右左的非空元素依次進(jìn)去
node.isVisit = true;
stack.add(node);
if(node.right!=null) {
stack.add(node.right);
}
if(node.left!=null) {
stack.add(node.left);
}
}
}
return res;
}
// 構(gòu)建樹(shù)
public TreeNode creatTree(int[] arr,int i) {
if(i>=arr.length) {
return null;
}
TreeNode root = new TreeNode(arr[i]);
root.left = creatTree(arr,2*i+1);
root.right = creatTree(arr,2*i+2);
return root;
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
boolean isVisit;
public TreeNode(int val) {
this.val = val;
}
}
非遞歸遍歷樹(shù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 注:本文來(lái)自 左程云的書(shū)《程序員代碼面試指南》 題目:分別用遞歸和非遞歸方法,實(shí)現(xiàn)二叉樹(shù)的先序遍歷(根左右)、中序...
- 一、生成二叉樹(shù) 新建一個(gè)類: 生成二叉樹(shù)方法: 生成二叉樹(shù): 二、前序遍歷 前序遍歷:訪問(wèn)順序是【根節(jié)點(diǎn)】-【左孩...
- #pragma mark - 樹(shù)的結(jié)構(gòu)體 typedef struct BiNode{ int data; ...
- 文/王少明 余秋雨在《鄉(xiāng)關(guān)何處》中說(shuō): “中國(guó)歷史上能文能武的人很多,但在兩方面都臻于極致的卻廖若晨星。三國(guó)時(shí)代曹...