An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push(1); push(2); push(3); pop(); pop(); push(4); pop(); pop(); push(5); push(6); pop(); pop(). Then a unique binary tree (shown in Figure 1) can be generated from this sequence of operations. Your task is to give the postorder traversal sequence of this tree.
Figure 1
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<=30) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 2N lines follow, each describes a stack operation in the format: "Push X" where X is the index of the node being pushed onto the stack; or "Pop" meaning to pop one node from the stack.
Output Specification:
For each test case, print the postorder traversal sequence of the corresponding tree in one line. A solution is guaranteed to exist. All the numbers must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:6 Push 1 Push 2 Push 3 Pop Pop Push 4 Pop Pop Push 5 Push 6 Pop PopSample Output:
3 4 2 6 5 1
解题思路:根据输入获得获得中序遍历和前序遍历,之后递归建立二叉树,再后续遍历获得结果!
package Test1051;
import java.util.Scanner;
import java.util.Stack;
class TreeNode1 {
int value;
TreeNode1 left;
TreeNode1 right;
public TreeNode1(int value) {
this.value = value;
left = null;
right = null;
}
}
public class TreeTraversalsAgain {
static int lastValue = 0;
public static void main(String[] args) {
String operate;
int nodeValue;
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
Stack<Integer> stack = new Stack<Integer>();
int[] preOrder = new int[N];
int[] inOrder = new int[N];
int preNum = 0;
int inNum = 0;
for (int i = 0; i < N * 2; i++) {
operate = sc.next();
if (operate.equals("Push")) {
nodeValue = sc.nextInt();
stack.push(nodeValue);
preOrder[preNum++] = nodeValue;
}
if (operate.equals("Pop")) {
inOrder[inNum++] = stack.pop();
}
}
lastValue = preOrder[0];
System.out.println("preOrder:");
for (int i = 0; i < N; i++) {
System.out.print(preOrder[i] + " ");
}
System.out.println();
System.out.println("inOrder:");
for (int i = 0; i < N; i++) {
System.out.print(inOrder[i] + " ");
}
System.out.println();
TreeNode1 root = buildTree(preOrder, 0, preOrder.length - 1, inOrder, 0, inOrder.length - 1);
printPost(root);
sc.close();
}
public static TreeNode1 buildTree(int[] preOrder, int preLeft, int preRight, int[] inOrder, int inLeft,
int inRight) {
if (preLeft > preRight)
return null;
TreeNode1 root = new TreeNode1(preOrder[preLeft]);
if (preLeft < preRight) {
int center = 0;
for (int i = inLeft; i <= inRight; i++) {
if (inOrder[i] == root.value) {
center = i;
break;
}
}
int leftLength = center - inLeft;
//需要注意:在preOrder中不能用center作为index,因为在buildTree方法中
//preOrder和inOrder的index不会一一对应(除了首次调用);
if (leftLength>0) {
root.left = buildTree(preOrder, preLeft + 1, preLeft + leftLength , inOrder, inLeft, center - 1);
}else{
root.left=null;
}
if (inRight > center) {
root.right = buildTree(preOrder, preLeft + leftLength + 1, preRight, inOrder, center + 1, inRight);
}else{
root.right=null;
}
}
return root;
}
public static void printPre(TreeNode1 root) {
System.out.println(root.value);
if (root.left != null)
printPre(root.left);
if (root.right != null)
printPre(root.right);
}
public static void printPost(TreeNode1 root) {
if (root.left != null) {
printPost(root.left);
}
if (root.right != null) {
printPost(root.right);
}
if (root.value != lastValue)
System.out.print(root.value + " ");
else
System.out.print(root.value);
}
}