题目大意
读入一棵二叉搜索树并横向打印
样例
10 8 5 7 12 4
样例输出
...|-12
10-|
...|-8-|
.......|...|-7
.......|-5-|
...........|-4
10-|
...|-8-|
.......|...|-7
.......|-5-|
...........|-4
思路
打印的 "|" 其实是子节点和祖先节点的连接,如果在搜索种能记录节点自身一行最末尾的 "|", 使其子节点能够打印与祖先节点的连接,就可以打印成树,但子节点不是和所有祖先节点都有连接的,子节点和直接父亲节点一定有连接。
在例子中,搜索过程:8->5->4 当搜索到5时,记录中有节点8的末尾位置,然后放入5的末尾位置后搜索到4时,4却不与8直接连接。如果节点i是其父亲节点的左子树,当从i往i的左子树搜索时,应该取出记录中的i的父节点记录,回溯后放回父节点记录,取出自身记录。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#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 pair<int, int> pp;
struct Node
{
int v, dep;
int l, r;
};
Node tr[MAXN];
int id = 0;
void ins(int t, int v)
{
if (tr[t].v < v)
{
if (tr[t].r >= 0)
ins(tr[t].r, v);
else
{
tr[t].r = id;
tr[id].v = v;
tr[id].dep = tr[t].dep + 1;
tr[id].l = tr[id].r = -1;
id++;
}
}
else if (tr[t].v > v)
{
if (tr[t].l >= 0)
ins(tr[t].l, v);
else
{
tr[t].l = id;
tr[id].v = v;
tr[id].dep = tr[t].dep + 1;
tr[id].l = tr[id].r = -1;
id++;
}
}
}
vector<pp> p;
void dfs(int u)
{
int l = tr[u].l, r = tr[u].r;
int cnt = 0;
if (p.size() > 0)
cnt = p.back().second;
if (tr[u].dep > 0)
cnt++;
int tmp = tr[u].v;
while (tmp)
{
cnt++;
tmp /= 10;
}
if (l >= 0 || r >= 0)
cnt += 2;
pp bk, prs;
int flag = 0, flag1 = 0;
if (p.size() > 0)
{
bk = p.back();
p.pop_back();
flag = 1;
}
prs.first = tr[u].v;
prs.second = cnt;
if (flag && bk.first < tr[u].v)
{
flag1 = 1;
}
else if (flag)
{
p.push_back(bk);
}
p.push_back(prs);
if (r >= 0)
dfs(r);
tmp = 0;
for (int i = 0; i < p.size() - 1; i++)
{
while (tmp < p[i].second - 1)
{
printf(".");
tmp++;
}
printf("|");
tmp++;
}
if (flag1)
{
while (tmp < bk.second - 1)
{
printf(".");
tmp++;
}
printf("|");
}
if (tr[u].dep > 0)
printf("-");
printf("%d", tr[u].v);
if (l >= 0 || r >= 0)
printf("-|");
printf("\n");
if (flag1)
{
p.pop_back();
p.push_back(bk);
p.push_back(prs);
}
else if (flag)
{
p.pop_back();
p.pop_back();
p.push_back(prs);
}
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()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif // ONLINE_JUDGE
int tmp;
scanf("%d", &tmp);
tr[id].l= tr[id].r = -1;
tr[id].dep = 0;
tr[id++].v = tmp;
while (scanf("%d", &tmp) != EOF)
{
ins(0, tmp);
}
dfs(0);
return 0;
}