3. 平衡二叉树

成绩10开启时间2018年11月20日 星期二 08:00
折扣0.8折扣时间2018年12月10日 星期一 23:55
允许迟交关闭时间2018年12月20日 星期四 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

 测试输入关于“测试输入”的帮助期待的输出关于“期待的输出”的帮助时间限制关于“时间限制”的帮助内存限制关于“内存限制”的帮助额外进程关于“{$a} 个额外进程”的帮助
测试用例 1以文本方式显示
  1. agxnzyimk↵
以文本方式显示
  1. Preorder: xigamknzy↵
  2. Inorder: agikmnxyz↵
  3. Postorder: agknmiyzx↵
  4. Tree:↵
  5.     z↵
  6.         y↵
  7. x↵
  8.             n↵
  9.         m↵
  10.             k↵
  11.     i↵
  12.         g↵
  13.             a↵
1秒64M0
测试用例 2以文本方式显示
  1. asdfghjkl↵
以文本方式显示
  1. Preorder: gdafjhlks↵
  2. Inorder: adfghjkls↵
  3. Postorder: afdhksljg↵
  4. Tree:↵
  5.             s↵
  6.         l↵
  7.             k↵
  8.     j↵
  9.         h↵
  10. g↵
  11.         f↵
  12.     d↵
  13.         a↵
1秒64M0

 

#include "stdio.h"
#include "stdlib.h"
typedef struct Avnode
{
    char data;
    struct Avnode * lchild, *rchild;
}NODE;
NODE *root = NULL;

int Height(NODE*p){
    if(p == NULL) return 0;
    else{
        if(Height(p->lchild) > Height(p->rchild))   return Height(p->lchild)+1;
        else return Height(p->rchild)+1;
    }
}

NODE* LL(NODE *p){
    NODE *q;
    q = p->lchild;
    p->lchild = q->rchild;
    q->rchild = p;
    return q;
}

NODE* RR(NODE *p){
    NODE *q = p->rchild;
    p->rchild = q->lchild;
    q->lchild = p;
    return q;
}

NODE* LR(NODE *p){
    NODE *q = p->lchild, *q1 = q->rchild;
    q->rchild = q1->lchild;
    p->lchild = q1;
    q1->lchild = q;
    p->lchild = q1->rchild;
    q1->rchild = p;
    return q1;
}

NODE* RL(NODE *p){
    NODE *q = p->rchild, *q1 = p->rchild->lchild;
    q->lchild = q1->rchild;
    p->rchild = q1;
    q1->rchild = q;
    p->rchild = q1->lchild;
    q1->lchild = p;
    return q1;
}

NODE* Insert(char c, NODE *p){
    if(p == NULL){
        p = (NODE*)malloc(sizeof(NODE));
        p->data = c;
        p->lchild = NULL;
        p->rchild = NULL;
        return p;
    }
    else{
        if(c < p->data){
            p->lchild = Insert(c, p->lchild);
            if(Height(p->lchild) - Height(p->rchild) > 1){
                if(c < p->lchild->data){
                    p = LL(p);
                }
                else{
                    p = LR(p);
                }
            }
            return p;
        }
        else{
            p->rchild = Insert(c, p->rchild);
            if(Height(p->lchild) - Height(p->rchild) < -1){
                if(c > p->rchild->data){
                    p = RR(p);
                }
                else{
                    p = RL(p);
                }
            }
            return p;
        }
    }
}

void Inorder(NODE *head)
{
    if (head->lchild)
        Inorder(head->lchild);
    printf("%c", head->data);
    if (head->rchild)
        Inorder(head->rchild);
}


void Preorder(NODE *head)
{
    printf("%c", head->data);
    if (head->lchild)
        Preorder(head->lchild);
    if (head->rchild)
        Preorder(head->rchild);
}
void Postorder(NODE *head)
{
    if (head->lchild)
        Postorder(head->lchild);
    if (head->rchild)
        Postorder(head->rchild);
    printf("%c", head->data);
}


void Print(NODE *p, int depth){
    int i;
    if (p->rchild)
        Print(p->rchild, depth + 1);
    for (i = 0; i < depth; i++)
        printf("    ");
    printf("%c\n", p->data);
    if (p->lchild)
        Print(p->lchild, depth + 1);
}

int main()
{
    char c;
    while (1)
    {
        c = getchar();
        if (c == '\n')
            break;
        root = Insert(c, root);
    }
    
    printf("Preorder: ");
    Preorder(root);
    putchar('\n');
    printf("Inorder: ");
    Inorder(root);
    putchar('\n');
    printf("Postorder: ");
    Postorder(root);
    putchar('\n');
    printf("Tree:\n");
    Print(root, 0);
    return 0;
}

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值