本题考查
二叉搜索树
思路
给定二叉搜索树结构,给定二叉搜索树中所有结点键值,将这些键值插入,并输出层序遍历结果。
重点就是根据二叉搜索树结构插入键值,根据二叉搜索树左子树元素小于根结点,右子树元素大于根结点,可以确定假设左子树有L个结点,右子树有R个结点,则根结点就是已经排好序的候选键值中的第L+1个。得到以上结论,接下来的重点就是计算一个结点左右子树的结点数,可以使用递归的方法计算子树结点数,比较简单不作赘述
AC代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static Node[] tree;
static ArrayList<String> result;
static class Node {
int key;
int leftChildNum;
int rightChildNum;
int leftChild;
int rightChild;
public Node (int leftChild, int rightChild) {
this.key = 0;
this.leftChild = leftChild;
this.rightChild = rightChild;
this.leftChildNum = 0;
this.rightChildNum = 0;
}
}
//计算子树结点数的函数
static int check(int index) {
int leftChildNum = 0;
int rightChildNum = 0;
if(tree[index].leftChild != -1) {
leftChildNum++;
leftChildNum += check(tree[index].leftChild);
}
if(tree[index].rightChild != -1) {
rightChildNum++;
rightChildNum += check(tree[index].rightChild);
}
tree[index].leftChildNum = leftChildNum;
tree[index].rightChildNum = rightChildNum;
return leftChildNum + rightChildNum;
}
//递归插入键值的函数
static void insert(int[] numbers, int start, int end, int index) {
int left = tree[index].leftChildNum;
tree[index].key = numbers[start + left];
if(tree[index].leftChild != -1)
insert(numbers, start, start + left - 1, tree[index].leftChild);
if(tree[index].rightChild != -1)
insert(numbers, start + left + 1, end, tree[index].rightChild);
}
//层序遍历函数
static void level(int root, int level) {
if(result.size() == level)
result.add(String.valueOf(tree[root].key) + " ");
else {
String temp = result.get(level);
temp += tree[root].key + " ";
result.set(level, temp);
}
if(tree[root].leftChild != -1) level(tree[root].leftChild, level + 1);
if(tree[root].rightChild != -1) level(tree[root].rightChild, level + 1);
}
public static void main(String[] args) {
Scanner scaner = new Scanner(System.in);
int num = scaner.nextInt();
tree = new Node[num];
int[] numbers = new int[num];
for(int i = 0 ; i < num ; i++) tree[i] = new Node(scaner.nextInt(), scaner.nextInt());
for(int i = 0 ; i < num ; i++) numbers[i] = scaner.nextInt();
scaner.close();
result = new ArrayList<String>();
Arrays.sort(numbers);
check(0);
insert(numbers, 0, num - 1, 0);
level(0, 0);
for(int i = 0 ; i < result.size() ; i++) {
System.out.print(result.get(i).trim());
if(i != result.size() - 1)
System.out.print(" ");
}
}
}