问题描述
二叉树可以用于排序。其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树。
当遇到空子树时,则把该节点放入那个位置。
比如,10 8 5 7 12 4 的输入顺序,应该建成二叉树如下图所示,其中.表示空白。
...|-12
10-|
...|-8-|
.......|...|-7
.......|-5-|
...........|-4
10-|
...|-8-|
.......|...|-7
.......|-5-|
...........|-4
本题目要求:根据已知的数字,建立排序二叉树,并在标准输出中横向打印该二叉树。
输入格式
输入数据为一行空格分开的N个整数。 N<100,每个数字不超过10000。
输入数据中没有重复的数字。
输出格式
输出该排序二叉树的横向表示。为了便于评卷程序比对空格的数目,请把空格用句点代替:
样例输入1
10 5 20
样例输出1
...|-20
10-|
...|-5
10-|
...|-5
样例输入2
5 10 20 8 4 7
样例输出2
.......|-20
..|-10-|
..|....|-8-|
..|........|-7
5-|
..|-4
这输出的格式我真心要吐血了。。。。。。。。。。。。。。
..|-10-|
..|....|-8-|
..|........|-7
5-|
..|-4
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Scanner;
class Node
{
int n;
int l = 100000,r = 100000;
}
public class Main
{
static Node tree[];
static int lev[];
static int n;
static String x[];
static int rec[];
static int ans = 0;
public static void main(String [] args) throws IOException
{
Scanner sc = new Scanner(System.in);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
String[] t = str.split(" ");
n = t.length;
int arr[] = new int[n];
tree = new Node[n];
lev = new int[n];
x = new String[n];
rec = new int[n];
for(int i = 0; i < n; ++i)
{
x[i] = "";
arr[i] = Integer.valueOf(t[i]);
}
tree[0] = new Node();
tree[0].n = arr[0];
lev[0] = 0;
for(int i = 1; i < n; ++i)
{
tree[i] = new Node();
tree[i].n = arr[i];
addNode(0,i,String.valueOf(tree[0].n).length()+1);
}
disp(0);
fun2();
fun();
sc.close();
}
static void fun()
{
for(String temp : x)
{
System.out.println(temp);
}
}
static void fun2()
{
for(int i = 0; i < n; ++i)
{
if(tree[i].r != 100000)
{
int t1 = rec[i];
int t2 = x[t1].length();
for(int j = 1; x[t1-j].charAt(t2-1) != '|'; ++j)
{
char t3[] = x[t1-j].toCharArray();
t3[t2-1] = '|';
x[t1-j] = String.valueOf(t3);
}
}
if(tree[i].l != 100000)
{
int t1 = rec[i];
int t2 = x[t1].length();
for(int j = 1; x[t1+j].charAt(t2-1) != '|'; ++j)
{
char t3[] = x[t1+j].toCharArray();
t3[t2-1] = '|';
x[t1+j] = String.valueOf(t3);
}
}
}
}
static void disp(int i)
{
if(i == 100000)
return;
disp(tree[i].r);
for(int cnt = 0; cnt < lev[i]; ++cnt)
{
x[ans] += ".";
}
if(i == 0)
{
if(tree[i].r != 100000 || tree[i].l != 100000)
{
rec[i] = ans;
x[ans++] += tree[i].n + "-|";
}
else
{
rec[i] = ans;
x[ans++] += tree[i].n + "";
}
}
else
{
if(tree[i].r != 100000 || tree[i].l != 100000)
{
rec[i] = ans;
x[ans++] += "|-" + tree[i].n + "-|";
}
else
{
rec[i] = ans;
x[ans++] += "|-" + tree[i].n;
}
}
disp(tree[i].l);
}
static void addNode(int root,int i,int level)
{
if(tree[i].n < tree[root].n)
{
if(tree[root].l == 100000)
{
lev[i] = level;
tree[root].l = i;
return;
}
else
{
addNode(tree[root].l,i,3+level+String.valueOf(tree[tree[root].l].n).length());
return;
}
}
else
{
if(tree[root].r == 100000)
{
lev[i] = level;
tree[root].r = i;
return;
}
else
{
addNode(tree[root].r,i,3+level+String.valueOf(tree[tree[root].r].n).length());
return;
}
}
}
}
这输出的格式我真心要吐血了。。。。。。。。。。。。。。