原理和我写过的“二叉树——根据先序(后序)和中序遍历建树”中的原理是相同的,除了一个层序遍历,这里说明一下层序遍历的原理:
加一个变量index,表示当前的根结点在二叉树中所对应的下标(从1开始),所以进行一次输出先序的递归的时候,就可以把根结点下标所对应的值存储在level数组中(一开始把level都置为0(或其他值)表示此处没有结点),这样在递归完成后level数组中非0的数就是按照下标排列的层序遍历的顺序。
/*
* 在不建树的情况下,根据先序
* (后序)和中序遍历输出后序(先序)和层序遍历
*/
import java.util.*;
public class OrderTree {
static int[] pre = {1, 2, 3, 4, 5, 6};
static int[] post = {3, 4, 2, 6, 5, 1};
static int[] in = {3, 2, 4, 1, 6, 5};
static int[] level = new int[10000];
static public void preOrder(int rootindex, int start, int end) {
if(start > end) return ;
int i = start;
while(i <= end && in[i] != post[rootindex]) i++;
System.out.printf("%d ", post[rootindex]);
preOrder(rootindex - (end - i) - 1, start, i - 1);
preOrder(rootindex - 1, i + 1, end);
}
static public void postOrder(int rootindex, int start, int end) {
if(start > end) return ;
int i = start;
while(i <= end && in[i] != pre[rootindex]) i++;
postOrder(rootindex + 1, start, i - 1);
postOrder(rootindex + (i - start) + 1, i + 1, end);
System.out.printf("%d ", pre[rootindex]);
}
static public void Order(int rootindex, int start, int end, int index) {
if(start > end) return ;
int i = start;
while(i <= end && in[i] != post[rootindex]) i++;
level[index] = post[rootindex];
Order(rootindex - (end - i) - 1, start, i - 1, 2 * index);
Order(rootindex - 1, i + 1, end, 2 * index + 1);
}
public static void main(String[] args) {
preOrder(5, 0, 5);
System.out.println();
postOrder(0, 0, 5);
System.out.println();
Order(5, 0, 5, 1);
for(int i=1;i<level.length;i++) {
if(level[i] != 0) {
System.out.printf("%d ", level[i]);
}
}
}
}