日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

横向打印二叉树

發布時間:2024/4/11 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 横向打印二叉树 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目:

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

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

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

?

總結

以上是生活随笔為你收集整理的横向打印二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。