蓝桥杯_横向打印二叉树

题目大意

读入一棵二叉搜索树并横向打印
样例
10 8 5 7 12 4 

样例输出
...|-12
10-|
...|-8-|
.......|...|-7
.......|-5-|
...........|-4

思路

打印的 "|" 其实是子节点和祖先节点的连接,如果在搜索种能记录节点自身一行最末尾的 "|", 使其子节点能够打印与祖先节点的连接,就可以打印成树,但子节点不是和所有祖先节点都有连接的,子节点和直接父亲节点一定有连接。
在例子中,搜索过程:8->5->4     当搜索到5时,记录中有节点8的末尾位置,然后放入5的末尾位置后搜索到4时,4却不与8直接连接。如果节点i是其父亲节点的左子树,当从i往i的左子树搜索时,应该取出记录中的i的父节点记录,回溯后放回父节点记录,取出自身记录。

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;
}

猜你喜欢

转载自blog.csdn.net/Anna__1997/article/details/79631718