讀入一棵二叉搜尋樹並橫向列印
樣例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更...