原题目地址

问题描述

二叉树可以用于排序。其原理很简单:对于一个排序二叉树添加新节点时,先与根节点比较,若小则交给左子树继续处理,否则交给右子树。
当遇到空子树时,则把该节点放入那个位置。
比如,10 8 5 7 12 4 的输入顺序,应该建成二叉树如下图所示,其中.表示空白。

…|-12
10-|
…|-8-|
…….|-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

以下为样例代码,请尽量不要贸然复制

小心刘渤源顺着网线爬到你家

样例代码

#include <bits/stdc++.h> typedef struct TNode
{
int key;
struct TNode *left;
struct TNode *right;
}TNode, *Tree;

Tree insert(Tree root, Tree src)
{
if(root == NULL)
{
root = src;
}
else if(src->key > root->key)
{
root->left = insert(root->left, src);
}
else
{
root->right = insert(root->right, src);
}
return root;
}

char l[1000];

#define U 1
#define D 2
#define S (‘.’)

void print(Tree root, int s, int dir)
{
if(root != NULL)
{
int i;
char buf[10];
sprintf(buf, “|-%d-“, root->key);
int len = strlen(buf);
for(i = 0; i < len; i++)
{
l[s + i] = S;
}
if(dir == D)
{
l[s] = ‘|’;
}
print(root->left, s + len, U);

    l\[s\] = '\\0';
    if(root->left == NULL && root->right == NULL)
    {
        buf\[len - 1\] = '\\0';
        printf("%s%s\\n", l, buf);
    }
    else
    {
        printf("%s%s|\\n", l, buf);
    }
    l\[s\] = S;

    if(dir == U)
    {
        l\[s\] = '|';
    }
    print(root->right, s + len, D);
    l\[s\] = S;
}

}

void printPre(Tree root, int s)
{
if(root != NULL)
{
int i;
char buf[10];
sprintf(buf, “%d-“, root->key);
int len = strlen(buf);
for(i = 0; i < len; i++)
{
l[s + i] = S;
}
print(root->left, s + len, U);

    printf("%s|\\n", buf);

    print(root->right, s + len, D);
}

}

int main(void)
{
int n;
Tree tree = NULL;
while(scanf(“%d”, &n) > 0)
{
Tree neo = malloc(sizeof(TNode));
neo->key = n;
neo->left = neo->right = NULL;
tree = insert(tree, neo);
}
printPre(tree, 0);
return 0;
}