2017去哪儿网在线笔试(二)


//题目描述:
//给定一棵二叉树的前序(根、左、右)和中序(左、根、右)的打印结果,输出此二叉树按层(从左往右)打印结果。
//例如一棵二叉树前序:1 2 4 5 3;中序:4 2 5 1 3。可以构建出下图所示二叉树:
//
//
//按层打印的结果则为:1 2 3 4 5。
//
//输入
//第一行只有一个数字,表示二叉树的节点数n(1<=n<=1000);
//第二行由a1,a2,...,an(1<=ai<=1000)组成的整数序列(用空格分隔)—表示前序打印结果;
//第三行由b1,b2,...,bn(1<=bi<=1000)组成的整数序列(用空格分隔)—表示中序打印结果。
//
//输出
//c1,c2,...,cn,用空格分隔—表示按层打印的结果。
//
//
//样例输入
//5
//1 2 4 5 3
//4 2 5 1 3
//
//样例输出
//1 2 3 4 5
class Worker{

/*数组的长度*/
int ILength;
/*结果数组已有的字数数量*/
int ITreeNum = 0;
/*结果数组里新树的最左下标*/
int INewTreeLeft = -1;
/*结果数组里新树的最右下标*/
int INewTreeRight = 0;

char tempC[];
/*结果数组*/         
int result[][];
/*前序数组*/
String qian[];
/*中序数组*/
String zhong[][];

StringBuilder builder; 


public Worker(){
builder = new StringBuilder("");
}

/*根据输入的第一行为ILength赋值*/
public void setLength(String s){
int lenght = 0;
tempC = s.toCharArray();
for(int i = tempC.length - 1,j = 0; i >= 0; i--,j++){
lenght += (tempC[i] - '0') * chengfang(j);
}
ILength = lenght;
}

/*根据第二行第三行输入的字符串初始化前序中序的数组,并创建结果序列数组*/
public void init(String s0, String s1){
int i = 0,j = 0;

qian = new String[ILength];
zhong = new String[ILength][2];
result = new int[ILength][3];
tempC = s0.toCharArray();
int length = s0.length();
for(i = 0, j = 0; i < length; i++){
if(tempC[i] != ' '){
builder.append(tempC[i]);
if(i == length -1){
qian[j] = builder.toString();
builder.delete(0, builder.capacity());
}
}else{
if(!builder.toString().trim().equals(null)){
qian[j] = builder.toString();
builder.delete(0, builder.capacity());
j++;
}
}
}

tempC = s1.toCharArray();
for(i = 0, j = 0; i < length; i++){
if(tempC[i] != ' '){
builder.append(tempC[i]);
if(i == length -1){
zhong[j][0] = builder.toString();
builder.delete(0, builder.capacity());
}
}else{
if(!builder.toString().trim().equals(null)){
zhong[j][0] = builder.toString();
builder.delete(0, builder.capacity());
j++;
}
}
}
for(i = 0; i < ILength; i++){
zhong[i][1] = "0";
result[i][0] = 0;
result[i][1] = 0;
result[i][2] = 0;
}
}

/*输入前序数组目标的下标值,输出目标在中序数组里的下标值*/
public int findZhongAdd(int index){
if(index >= ILength){
return -1;
}
String s = qian[index];
for(int i = 0; i < ILength; i++){
if(s.equals(zhong[i][0])){
return i;
}
}
return -1;
}

/*输入中序数组里目标的下标值,计算该目标左子树的个数*/
public int countLeftNum(int index){
int num = 0;
while((index - 1) >= 0 && (zhong[index - 1][1].equals("0"))){
index--;
num++;
}
return num;
}

/*输入右子树下标值,判断是否有效*/
public boolean checkRight(int rightAddr){
if((rightAddr >= 0) && (rightAddr < ILength) && zhong[rightAddr][1].equals("0"))
return true;
return false;
}


/*计算10的i次方*/
public int chengfang(int i){
int result = 1;
if(i == 0)
return result;
for(int ii = 0; ii < i; ii++){
result *= 10;
}
return result;
}

/*
 * 输入结果数组的下标,处理左子树及右子树
*/
public void xxx(int i){
int root = 0;
int left = 0;
int right = 0;
int temp = 0;
int num = 0;
if(result[i][1] != -1){
root = result[i][1];
temp = findZhongAdd(result[i][1]);
num = countLeftNum(temp);
if(num > 0){
left = root + 1;
right = left + num;
}else{
left = -1;
right = root + 1;
}
if(!checkRight(findZhongAdd(right))){
right = -1;
}
result[ITreeNum][0] = root;
result[ITreeNum][1] = left;
result[ITreeNum][2] = right;
ITreeNum++;
zhong[temp][1] = "1";
if(left != -1){
zhong[findZhongAdd(left)][1] = "1";
}
if(right != -1){
zhong[findZhongAdd(right)][1] = "1";
}
}
if(result[i][2] != -1){
root = result[i][2];
temp = findZhongAdd(result[i][2]);
num = countLeftNum(temp);
if(num > 0){
left = root + 1;
right = left + num;
}else{
left = -1;
right = root + 1;
}
if(!checkRight(findZhongAdd(right))){
right = -1;
}
result[ITreeNum][0] = root;
result[ITreeNum][1] = left;
result[ITreeNum][2] = right;
ITreeNum++;
zhong[temp][1] = "1";
if(left != -1){
zhong[findZhongAdd(left)][1] = "1";
}
if(right != -1){
zhong[findZhongAdd(right)][1] = "1";
}
}
}

/*输出结果数组*/
public void doit(){

int temp = 0;
int rootLoc = 0;
int leftLoc = 0;
int rightLoc = 0;
int num = 0;
while(INewTreeLeft < (ILength - 1)){
if(INewTreeLeft == -1){
rootLoc = 0;
temp = findZhongAdd(0);
num = countLeftNum(temp);
if(num > 0){
leftLoc = rootLoc + 1;
rightLoc = leftLoc + num;
}else{
leftLoc = -1;
rightLoc = rootLoc + 1;
}
if(!checkRight(findZhongAdd(rightLoc))){
rightLoc = -1;  
}
result[ITreeNum][0] = rootLoc;
result[ITreeNum][1] = leftLoc;
result[ITreeNum][2] = rightLoc;
ITreeNum++;
zhong[temp][1] = "1";
if(leftLoc != -1){
zhong[findZhongAdd(leftLoc)][1] = "1";
}
if(rightLoc != -1){
zhong[findZhongAdd(rightLoc)][1] = "1";
}
}else{
xxx(INewTreeLeft);
}
INewTreeLeft++;
}
}

public void printLength(){
System.out.println(ILength);
}

public void printQianZhong(){
for(int i = 0; i < ILength; i++){
System.out.print(qian[i] + " ");
}
System.out.println();
for(int i = 0; i < ILength; i++){
System.out.print(zhong[i][0] + " ");
}
System.out.println();
for(int i = 0; i < ILength; i++){
System.out.print(zhong[i][1] + " ");
}
System.out.println();
}

public void printResult(){
for(int i = 0; i < ILength; i++){
System.out.print(result[i][0] + " ");
}
System.out.println();
for(int i = 0; i < ILength; i++){
System.out.print(result[i][1] + " ");
}
System.out.println();
for(int i = 0; i < ILength; i++){
System.out.print(result[i][2] + " ");
}
System.out.println();
}



public class Qunar {


public static void main(String[] args) {
// TODO 自动生成的方法存根
Worker w = new Worker();
//测试1
w.setLength("5");
w.init("1 2 4 5 3", "4 2 5 1 3");
//测试2
// w.setLength("9");
// w.init("1 2 4 5 8 9 3 6 7", "4 2 9 8 5 1 6 3 7");
w.printLength();
w.printQianZhong();
w.doit();
w.printResult();
}


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值