题目:
根据二叉树的前序遍历和中序遍历构建二叉树,并进行层序遍历输出结果。
代码:
import java.util.*;
//节点
class Node {
int val;
Node left;
Node right;
Node(int val) {
this.val = val;
}
}
public class Main {
// 递归构建树
public static Node CreateTree(int[] front, int[] back) {
int len = front.length;
if (len == 0)
return null;
Node head = new Node(front[0]);
// 寻找中序的根节点
int index = 0;
for (int i = 0; i < len; i++) {
if (front[0] == back[i]) {
index = i;
break;
}
}
// 拆分2个数组
int[] frontLeft = Arrays.copyOfRange(front, 1, index + 1);
int[] frontRight = Arrays.copyOfRange(front, index + 1, len);
int[] backLeft = Arrays.copyOfRange(back, 0, index);
int[] backRight = Arrays.copyOfRange(back, index + 1, len);
head.left = CreateTree(frontLeft, backLeft);
head.right = CreateTree(frontRight, backRight);
return head;
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int n = in.nextInt();
int[] front = new int[n];
int[] back = new int[n];
for (int i = 0; i < n; i++)
front[i] = in.nextInt();
for (int i = 0; i < n; i++)
back[i] = in.nextInt();
Node head = CreateTree(front, back);
// 层序遍历树
//使用队列来存储
Queue<Node> queue = new LinkedList<Node>();
queue.add(head);
int[] result = new int[n];
int k = 0;
while (queue.size() != 0) {
Node visitedNode = queue.remove();
result[k] = visitedNode.val;
k++;
if (visitedNode.left != null)
queue.add(visitedNode.left);
if (visitedNode.right != null)
queue.add(visitedNode.right);
}
//输出结果
for (int i = 0; i < n - 1; i++) {
System.out.print(result[i] + " ");
}
System.out.print(result[n - 1]);
}
}
}