横向打印二叉树
題目:
二叉樹可以用于排序。其原理很簡單:對于一個排序二叉樹添加新節點時,先與根節點比較,若小則交給左子樹繼續處理,否則交給右子樹。
當遇到空子樹時,則把該節點放入那個位置。
比如,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; }?
總結
- 上一篇: UVA211 TheDomino Eff
- 下一篇: UVA690 Pipeline Sche