【Java语言学习】之递归、非递归前序、中序、后续遍历二叉树

package com.nowcoder.校招真题2016;

import java.util.Stack;
import java.util.HashMap;

public class BinTree {
private char date;
private BinTree lchild;
private BinTree rchild;

public BinTree(char c) {
date = c;
}

// 先序遍历递归
public static void preOrder(BinTree t) {
if (t == null) {
return;
}
System.out.print(t.date);
preOrder(t.lchild);
preOrder(t.rchild);
}

// 中序遍历递归
public static void InOrder(BinTree t) {
if (t == null) {
return;
}
InOrder(t.lchild);
System.out.print(t.date);
InOrder(t.rchild);
}

// 后序遍历递归
public static void PostOrder(BinTree t) {
if (t == null) {
return;
}
PostOrder(t.lchild);
PostOrder(t.rchild);
System.out.print(t.date);
}

// 先序遍历非递归
public static void preOrder2(BinTree t) {
Stack<BinTree> s = new Stack<BinTree>();
while (t != null || !s.empty()) {
while (t != null) {
System.out.print(t.date);
s.push(t);
t = t.lchild;
}
if (!s.empty()) {
t = s.pop();
t = t.rchild;
}
}
}

// 中序遍历非递归
public static void InOrder2(BinTree t) {
Stack<BinTree> s = new Stack<BinTree>();
while (t != null || !s.empty()) {
while (t != null) {
s.push(t);
t = t.lchild;
}
if (!s.empty()) {
t = s.pop();
System.out.print(t.date);
t = t.rchild;
}
}
}

// 后序遍历非递归
public static void PostOrder2(BinTree t) {
Stack<BinTree> s = new Stack<BinTree>();
Stack<Integer> s2 = new Stack<Integer>();
Integer i = new Integer(1);
while (t != null || !s.empty()) {
while (t != null) {
s.push(t);
s2.push(new Integer(0));
t = t.lchild;
}
while (!s.empty() && s2.peek().equals(i)) {
s2.pop();
System.out.print(s.pop().date);
}

if (!s.empty()) {
s2.pop();
s2.push(new Integer(1));
t = s.peek();
t = t.rchild;
}
}
}

public static void main(String[] args) {
BinTree b1 = new BinTree('a');
BinTree b2 = new BinTree('b');
BinTree b3 = new BinTree('c');
BinTree b4 = new BinTree('d');
BinTree b5 = new BinTree('e');

/**
*      a
*     / /
*    b   c
*   / /
*  d   e
*/
b1.lchild = b2;
b1.rchild = b3;
b2.lchild = b4;
b2.rchild = b5;

BinTree.preOrder(b1);
System.out.println();
BinTree.preOrder2(b1);
System.out.println();
BinTree.InOrder(b1);
System.out.println();
BinTree.InOrder2(b1);
System.out.println();
BinTree.PostOrder(b1);
System.out.println();
BinTree.PostOrder2(b1);
}
}


• 本文已收录于以下专栏：

C++实现二叉树前序中序后续遍历的非递归方法总结

• njustzj001
• 2014年10月13日 15:16
• 2491

递归和非递归实现二叉树的后续遍历

• jcm666666
• 2016年09月03日 21:24
• 494

树的学习——（递归构建二叉树、递归非递归前序中序后序遍历二叉树、根据前序序列、中序序列构建二叉树）

• zinss26914
• 2012年12月29日 10:46
• 7669

二叉树的前序、中序、后序的递归与非递归遍历算法实现

• u011954296
• 2016年07月12日 12:31
• 2816

二叉树的创建 先序 中序 后续 递归和非递归遍历

• u011561690
• 2015年04月15日 19:00
• 879

二叉树先序、中序、后续遍历递归以及非递归java实现

• u011824857
• 2016年09月21日 22:15
• 1313

二叉树的建树、遍历（先序、中序、后序、层次）（递归和非递归）--Java实现

• u014039577
• 2015年12月24日 17:55
• 1960

二叉树（1）----先序遍历（前序遍历），递归和非递归方式实现

1、二叉树节点定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef stru...
• beitiandijun
• 2014年12月14日 19:00
• 3779

二叉树的非递归遍历以及层次遍历（前序、中序、后序）

• yusiguyuan
• 2014年11月07日 21:11
• 1671

根据前序和中序序列，建立二叉树（java实现）

• A784586
• 2017年01月09日 18:13
• 658

举报原因： 您举报文章：【Java语言学习】之递归、非递归前序、中序、后续遍历二叉树 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)