藍橋杯 橫向列印二叉樹

2021-08-17 07:18:25 字數 2135 閱讀 1279

讀入一棵二叉搜尋樹並橫向列印

樣例10 8 5 7 12 4 

樣例輸出

列印的 "|" 其實是子節點和祖先節點的連線,如果在搜尋種能記錄節點自身一行最末尾的 "|", 使其子節點能夠列印與祖先節點的連線,就可以列印成樹,但子節點不是和所有祖先節點都有連線的,子節點和直接父親節點一定有連線。

在例子中,搜尋過程:8->5->4     當搜尋到5時,記錄中有節點8的末尾位置,然後放入5的末尾位置後搜尋到4時,4卻不與8直接連線。如果節點i是其父親節點的左子樹,當從i往i的左子樹搜尋時,應該取出記錄中的i的父節點記錄,回溯後放回父節點記錄,取出自身記錄。

i和i的子樹需要列印的位置的差別除了子樹需要列印i的位置以外,就只需要判斷子樹是否需要列印i的父親節點。

#include #include #include #include #include #include #define inf 0x3f3f3f3f

#define rep0(i, n) for (int i = 0; i < n; i++)

#define rep1(i, n) for (int i = 1; i <= n; i++)

#define rep_0(i, n) for (int i = n - 1; i >= 0; i--)

#define rep_1(i, n) for (int i = n; i > 0; i--)

#define max(x, y) (((x) > (y)) ? (x) : (y))

#define min(x, y) (((x) < (y)) ? (x) : (y))

#define mem(x, y) memset(x, y, sizeof(x))

#define maxn 110

using namespace std;

typedef pairpp;

struct node

;node tr[maxn];

int id = 0;

void ins(int t, int v)

}else if (tr[t].v > v)

}}vectorp;

void dfs(int u)

if (l >= 0 || r >= 0)

cnt += 2;

pp bk, prs;

int flag = 0, flag1 = 0;

if (p.size() > 0)

prs.first = tr[u].v;

prs.second = cnt;

if (flag && bk.first < tr[u].v)

else if (flag)

p.push_back(prs);

if (r >= 0)

dfs(r);

tmp = 0;

for (int i = 0; i < p.size() - 1; i++)

printf("|");

tmp++;

}if (flag1)

printf("|");

}if (tr[u].dep > 0)

printf("-");

printf("%d", tr[u].v);

if (l >= 0 || r >= 0)

printf("-|");

printf("\n");

if (flag1)

else if (flag)

if (l >= 0)

dfs(l);

p.pop_back();

if (p.size() > 0 && p.back().first != bk.first)

p.push_back(bk);

if (p.size() == 0)

p.push_back(bk);

}int main()

dfs(0);

return 0;

}

橫向列印二叉樹

二叉樹可以用於排序。其原理很簡單 對於乙個排序二叉樹新增新節點時,先與根節點比較,若小則交給左子樹繼續處理,否則交給右子樹。當遇到空子樹時,則把該節點放入那個位置。比如,10 8 5 7 12 4 的輸入順序,應該建成二叉樹如下圖所示,其中.表示空白。12 10 8 7 5 4 本題目要求 根據已知...

藍橋杯 顯示二叉樹

排序二叉樹的特徵是 某個節點的左子樹的所有節點值都不大於本節點值。某個節點的右子樹的所有節點值都不小於本節點值。為了能形象地觀察二叉樹的建立過程,小明寫了一段程式來顯示出二叉樹的結構來。include include define n 1000 define height 100 define wi...

二叉樹列印

舉例 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更...