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());
}
}
/****
* 思想:构建树的时候,加入isVisit属性,全部默认为false;
* 先添加root节点进栈;
* 执行while循环:(1)弹出栈顶节点node;(2)如果visit==true;则添加进入结果,回到while循环;
* 否则,增加入栈,遵循返过来的顺序和判空,当前节点的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(模板,唯一差别部分)======
// 先序遍历(根左右)进栈:右左根的非空元素依次进去
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 {
// 中序遍历(左根右)进栈:右根左的非空元素依次进去
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 {
// 后序遍历(左右根)进栈:根右左的非空元素依次进去
node.isVisit = true;
stack.add(node);
if(node.right!=null) {
stack.add(node.right);
}
if(node.left!=null) {
stack.add(node.left);
}
}
}
return res;
}
// 构建树
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;
}
}
非递归遍历树
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 注:本文来自 左程云的书《程序员代码面试指南》 题目:分别用递归和非递归方法,实现二叉树的先序遍历(根左右)、中序...
- 一、生成二叉树 新建一个类: 生成二叉树方法: 生成二叉树: 二、前序遍历 前序遍历:访问顺序是【根节点】-【左孩...