成绩 | 10 | 开启时间 | 2017年11月6日 星期一 14:45 |
折扣 | 0.8 | 折扣时间 | 2017年11月28日 星期二 23:55 |
允许迟交 | 否 | 关闭时间 | 2018年01月8日 星期一 23:55 |
程序输入一个字符串(只包含小写字母),请按照字符的输入顺序建立平衡二叉排序树,并分别输出二叉树的先序序列、中序序列和后序序列,最后输出该二叉树向左旋转 90 度后的结构,如,下图所表示的二叉树,
向左旋转 90 度后,以每层向里缩进 4 个空格的方式输出,输出结果为:
i
g
f
a
d
c
b
输入:agxnzyimk
输出:
Preorder: xigamknzy
Inorder: agikmnxyz
Postorder: agknmiyzx
Tree:
z
y
x
n
m
k
i
g
a
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
测试用例 3 | 以文本方式显示
| 以文本方式显示
| 1秒 | 64M | 0 |
#include<stdio.h>
#include<stdlib.h>
typedef struct node
{
int height;
char data;
struct node* lchild;
struct node* rchild;
}AVLNode,*AVLTree;
int Height(AVLTree T)
{
if (!T) return -1;
return T->height;
}
AVLTree Simpleleft(AVLTree k2)
{
AVLTree k1;
k1 = k2->lchild;
k2->lchild = k1->rchild;
k1->rchild = k2;
k1->height = Max(Height(k1->lchild), Height(k1->rchild)) + 1;
k2->height = Max(Height(k2->lchild), Height(k2->rchild)) + 1;
return k1;
}
AVLTree Simpleright(AVLTree k2)
{
AVLTree k1;
k1 = k2->rchild;
k2->rchild = k1->lchild;
k1->lchild = k2;
k1->height = Max(Height(k1->lchild), Height(k1->rchild)) + 1;
k2->height = Max(Height(k2->lchild), Height(k2->rchild)) + 1;
return k1;
}
AVLTree Doubleleft(AVLTree K3)
{
K3->lchild = Simpleright(K3->lchild);
return Simpleleft(K3);
}
AVLTree Doubleright(AVLTree K3)
{
K3->rchild = Simpleleft(K3->rchild);
return Simpleright(K3);
}
int Max(int a, int b)
{
return a > b ? a : b;
}
AVLTree Insert(char data, AVLTree T)
{
if (T == NULL)
{
T = (AVLTree)malloc(sizeof (struct node));
T->data = data; T->height = 0; T->lchild = T->rchild = NULL;
}
else if (data < T->data)
{
T->lchild = Insert(data, T->lchild);
if (Height(T->lchild) - Height(T->rchild) == 2)
if (data<T->lchild->data)
T = Simpleleft(T);
else
T = Doubleleft(T);
}
else if (data>T->data)
{
T->rchild = Insert(data, T->rchild);
if (Height(T->rchild) - Height(T->lchild) == 2)
if (data>T->rchild->data)
T = Simpleright(T);
else
T = Doubleright(T);
}
T->height = Max(Height(T->lchild), Height(T->rchild)) + 1;
return T;
}
void Pre(AVLTree t)
{
if (t)
{
printf("%c", t->data);
Pre(t->lchild);
Pre(t->rchild);
}
}
void In(AVLTree t)
{
if (t)
{
In(t->lchild);
printf("%c", t->data);
In(t->rchild);
}
}
void Post(AVLTree t)
{
if (t)
{
Post(t->lchild);
Post(t->rchild);
printf("%c", t->data);
}
}
void PrintAVLTree(AVLTree t,int depth)
{
if (t)
{
if (t->rchild)
PrintAVLTree(t->rchild, depth + 1);
for (int i = 0; i < depth; i++)
printf(" ");
printf("%c\n", t->data);
if (t->lchild)
PrintAVLTree(t->lchild,depth+1);
}
}
int main()
{
//freopen("1.txt", "r", stdin);
char tree[50];
gets(tree);
AVLTree root = NULL;
for (int i = 0; tree[i]; i++)
{
root=Insert(tree[i], root);
}
printf("Preorder: ");
Pre(root); printf("\n");
printf("Inorder: ");
In(root); printf("\n");
printf("Postorder: ");
Post(root); printf("\n");
printf("Tree:\n");
PrintAVLTree(root,0);
return 0;
}