橫向列印二叉樹
阿新 • • 發佈:2018-12-13
題目:
二叉樹可以用於排序。其原理很簡單:對於一個排序二叉樹新增新節點時,先與根節點比較,若小則交給左子樹繼續處理,否則交給右子樹。
當遇到空子樹時,則把該節點放入那個位置。
比如,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; }