横向打印二叉树

题目:

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

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

比如,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

分析:排序二叉树,主要是输出,先将各个结点所在的输出层下标计算好了,然后每次都从节点的左边子节点的输出层下标layer到节点的右边子节点的输出层下标,依次替换数组”.“,为”|“。主要就是这个有时候会想不到,还有数组的结束符\0要加上。

代码:

#include<iostream>
#include<string>
#include<string.h>
#include<queue>
#include<vector>
#include<list>
#include<set>
#include<sstream>
#include<algorithm>
#include<iomanip>
using namespace std;
typedef struct node {
	int u;
	int layer;//所在层数
	int ls=0;//左子树个数
	int rs=0;//右子树个数
	struct node *left;
	struct node *right;
}pNode, *Node;
int depth[10000];
int val[100];
int n;
char mp[110][710];
bool createTree(Node &T, int u) {
	if (T->u < u) {
		T->rs++;
		if (T->right == NULL) {
			Node next = new pNode();
			next->u = u;
			T->right = next;
			
			return true;
		}
		else {
			if (createTree(T->right, u))return true;
		}
	}
	else if (T->u > u) {
		T->ls++;
		if (T->left == NULL) {
			Node next = new pNode();
			next->u = u;
			T->left = next;
			
			return true;
		}
		else {
			if (createTree(T->left, u))return true;
		}
	}
}
int dp(Node &T, int v, int layer) {
	if (T->u < v) {
		dp(T->right, v, layer + 1);
	}
	else if (T->u > v) {
		dp(T->left, v, layer + 1);
	}
	else  if (T->u == v) {
		return layer;
	}
}
int intostr(int num,char *x) {
	int k = 0;
	while (num != 0) {
		x[k++]=char(num % 10+'0');
		num /= 10;
	}
	return k;
}
void deep(int id,Node &u) {//计算各个节点层数
	u->layer= u->rs + id+1;
	if (u->right != NULL)deep(id, u->right);
	if (u->left != NULL)deep(u->layer, u->left);
}
void solve(Node &u,int indexs) {
	char t[6];
	int lt = intostr(u->u, t);
	for (int i =0; i <lt; i++) {
		mp[u->layer][i + indexs] = t[lt-i-1];
	}
	if (u->right != NULL || u->left != NULL) {
		mp[u->layer][indexs += lt] = '-';
		int mins = u->layer, maxs = u->layer;
		if (u->right != NULL) {
			mins = u->right->layer;
			mp[mins][indexs + 2] = '-';
			solve(u->right, indexs + 3);
		}
		if (u->left != NULL) {
			maxs = u->left->layer;
			mp[maxs][indexs + 2] = '-';
			solve(u->left, indexs + 3);
		}
		for (int i = mins; i <= maxs; i++) {
			mp[i][indexs + 1] = '|';
		}
		mp[u->layer][indexs + 2] = '\0';
	}
	else {
		mp[u->layer][indexs+lt] = '\0';
		return;//没有子节点就返回
	}
}
int main() {
	int a;
	while (cin >> a) {
		n = 0;
		memset(mp, '.', sizeof(mp));
		val[n++] = a;
		Node t = new pNode();
		t->u = a;
		while (cin >> a) {
			createTree(t, a);;
			val[n++] = a;
		}
	/*	sort(val, val + n);
		for (int i = 0; i < n; i++) {
			depth[i] = dp(t, val[i], 0);
			cout << val[i] << ":" << depth[i] << endl;
		}*/
		deep(0, t);
		solve(t, 0);
		for (int i = 1; i <=n; i++) {
			cout << mp[i] << endl;
		}
	}

	//system("pause");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36973725/article/details/84592646