1. 程式人生 > >橫向列印二叉樹

橫向列印二叉樹

題目:

二叉樹可以用於排序。其原理很簡單:對於一個排序二叉樹新增新節點時,先與根節點比較,若小則交給左子樹繼續處理,否則交給右子樹。

當遇到空子樹時,則把該節點放入那個位置。

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