蓝桥杯 横向打印二叉树

问题描述

二叉树可以用于排序。其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树。

当遇到空子树时,则把该节点放入那个位置。

比如,10 8 5 7 12 4 的输入顺序,应该建成二叉树如下图所示,其中.表示空白。

...|-12
10-|
...|-8-|
.......|...|-7
.......|-5-|
...........|-4

本题目要求:根据已知的数字,建立排序二叉树,并在标准输出中横向打印该二叉树。

输入格式

输入数据为一行空格分开的N个整数。 N<100,每个数字不超过10000。

输入数据中没有重复的数字。

输出格式

输出该排序二叉树的横向表示。为了便于评卷程序比对空格的数目,请把空格用句点代替:

样例输入1
10 5 20
样例输出1
...|-20
10-|
...|-5
样例输入2
5 10 20 8 4 7
样例输出2
.......|-20
..|-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;
			}
				
		}
		
	}
	
}

这输出的格式我真心要吐血了。。。。。。。。。。。。。。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值