通过递归方式建立一棵树,之后分别给出树后序遍历的递归和非递归方式
这是一棵树
终端输入:
A
B
#
C
D
#
#
E
#
#
F
#
G
H
#
#
#
//code
public class CreateTree {
public static void main(String[] args) {
TreeNode t = null;
TreeNode input = input(t);
beforeTraversal(input);
System.out.println();
beforeTraversal1(input);
//System.out.println(input);
}
//递归方式建树
public static TreeNode input(TreeNode T){
Scanner scanner = new Scanner(System.in);
String in = scanner.next();
if("#".equals(in)){
T = null;
}else{
T = new TreeNode();
T.data = in;
T.left = input(T.left);
T.right = input(T.right);
}
return T;
}
//后续遍历 递归方法
public static void beforeTraversal(TreeNode node){
if(node!=null){
beforeTraversal(node.left);
beforeTraversal(node.right);
System.out.print(node.data);
System.out.print(" ");
}
}
//后序遍历 非递归方法
public static void beforeTraversal1(TreeNode node){
//定义栈用于存放节点
Stack<TreeNode> stack = new Stack<>();
if(node!=null){
TreeNode node1 = node;
TreeNode cur = null; //栈顶元素
TreeNode h = node; //记录最近弹出的节点
while (true) {
//压入树节点,直至左节点为空
while (node1 != null) {
stack.push(node1);
node1 = node1.left;
}
if (!stack.isEmpty()) {
//节点一旦弹出就找不到了,因此在这不弹出,先进行判断
cur = stack.peek();
//当该节的右子节点为null 或者 该节点的右子节点已经打印过了
//根据后续排序:左 右 中,因此就应当弹出该节点
if (cur.right == null || cur.right == h) {
System.out.print(stack.pop().data);
System.out.print(" ");
//记得保留刚刚弹出的节点
h = cur;
} else {
//如果节点不满足上述条件,这说明还需继续压入
node1 = cur.right;
}
}else {
return;
}
}
}
}
}