橫向列印二叉樹

2022-08-12 13:09:23 字數 3074 閱讀 8057

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

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

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

這個題並沒有做出來,首先手打了乙個二叉搜尋樹,然後中序遍歷,遍歷的結果就是這個橫向列印的二叉樹的從下向上的值,如樣例中的:

5  10  20  8  4  7

中序遍歷的結果是:

4  5  7  8  10  20

也剛好是排序之後的結果。

在這裡我還有乙個問題沒有解決,那就是求每個節點的深度,或是每個深度都有哪些節點。這樣子的話,我們就能找到每個值在二叉樹中的具體位置(只要我們把這個樹看成乙個網格)

但是這個二叉樹的第乙個指標指向的不是根節點,而是最後乙個我們插入的值。最終也沒能算出每個節點的深度。

1 #include2 #include34

using

namespace

std;56

struct

node;

1011

//插入

12 node* insert(node *p, int

x)13

20else25}

2627

//查詢

28int find(node* p, int x, int

dp)29 35

3637

38//

刪除39 node* remove(node *p, int

x)40

49else

if(p -> lc -> rc ==null)

55else

65return

p;66

} 67

68//

回憶一下整數快速冪

69int pow(int x, int

n)70

79return

ret;80}

8182

//中序遍歷

83int ret[109] = ;

84int num = 0;85

void inoder(node *b)

8693}94

95//

求節點的深度

96int find_deep(node *p, int x, int

dp)97

105}

106107

/*-----------------------------

*/108

//查詢某個節點的深度

109static

int depth=0

;110

void print_depth(node *p)

111120

out:

121 depth--;

122}

123/*

----------------------------

*/124

void level_sum_out(node *p, int

level)

129130

if(1==level)else

136} 137

138//

如何求出二叉樹的高度?

139int getheight(node *p)else

147} 148

/*----------------------------

*/149

intmain()

150

160//

cout<

//建立二叉搜尋樹

162 node *t =null;

163 s = "

" +s;

164//

反向迭代器可以避免考慮數的位數

165string

::reverse_iterator rite;

166int k = 0, num = 0

;167

for(rite = s.rbegin();rite!=s.rend();rite++)

174 num += (int(*rite)-'

0') * pow(10, k++);

175}

176//

接下來就是想辦法將它列印出來

177//

中序遍歷

178inoder(t);

179for(int i=1;i<=num;i++)

180 cout

181 cout<

;182

183//

cout<

185int y = find_deep(t, 4, 1

);186

//int y = find(t, 5, 1);

187 cout

188189

return0;

190 }

view code

2019-02-20

08:32:26

藍橋杯 橫向列印二叉樹

讀入一棵二叉搜尋樹並橫向列印 樣例10 8 5 7 12 4 樣例輸出 列印的 其實是子節點和祖先節點的連線,如果在搜尋種能記錄節點自身一行最末尾的 使其子節點能夠列印與祖先節點的連線,就可以列印成樹,但子節點不是和所有祖先節點都有連線的,子節點和直接父親節點一定有連線。在例子中,搜尋過程 8 5 ...

二叉樹列印

舉例 1.初始化時,last 1,把1放入佇列 2.將1出隊,把1的子孩子2,3放入佇列,更新nlast 3 3.nlast更新完之後,列印上一次出隊的1,並和last比較,如果相同就列印換行,並更新last nlast 3 4.將2出隊,把2的子孩子4放入佇列,更新nlast 4 5,nlast更...

二叉樹列印

給定一顆二叉樹的頭節點head,請按照現在大家看到的這種格式列印 要求列印成 12 主要解決的問題是 如何換行 last 表示正在列印的當前行的最右節點 從左至右遍歷,如果遍歷到last節點,說明該換行了,換行之後,只需要nlast last,繼續下一行的列印過程,一直重複,直到所有的節點都列印完。...