平衡二叉树的先序中序后序及旋转输出

程序输入一个字符串(只包含小写字母),请按照字符的输入顺序建立平衡二叉排序树,并分别输出二叉树的先序序列、中序序列和后序序列,最后输出该二叉树向左旋转 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>   
#include<iostream>  
#include<algorithm>  
  
using namespace std;  
   
typedef struct node {   
    int height;   
    char data;   
    struct node *lchild,*rchild;   
}AVLNode,*AVLTree;   
  
  
int Height(AVLTree T)   
{   
    if (!T) return -1;   
    return T->height;   
}   
  
AVLTree LL(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 RR(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 LR(AVLTree K3)   
{   
    K3->lchild = RR(K3->lchild);   
    return LL(K3);   
}   
  
   
AVLTree RL(AVLTree K3)   
{   
    K3->rchild = LL(K3->rchild);   
    return RR(K3);   
}   
  
  
AVLTree insert(char data, AVLTree T)   
{   
    if(T == NULL)   
    {   
        T = (AVLTree)malloc(sizeof (AVLNode));   
        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 = LL(T);   
            else T = LR(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 = RR(T);   
            else T = RL(T);   
        }  
    }   
    T->height = max(Height(T->lchild), Height(T->rchild))+1;   
    return T;   
}   
  
  
void preorder(AVLTree t)   
{   
    if (t)   
    {     
        printf("%c", t->data);     
        preorder(t->lchild);       
        preorder(t->rchild);   
    }   
}   
  
   
void inorder(AVLTree t)   
{   
    if (t)   
    {   
        inorder(t->lchild);   
        printf("%c", t->data);   
        inorder(t->rchild);   
    }   
}   
  
  
void postorder(AVLTree t)   
{   
    if (t)   
    {   
        postorder(t->lchild);   
        postorder(t->rchild);   
        printf("%c", t->data);   
    }   
}   
  
void print(AVLTree t,int depth)   
{   
    if (t)    
    {             
        if (t->rchild)   
        print(t->rchild, depth + 1);   
        for (int i = 0; i < depth; i++) printf("    ");   
        printf("%c\n", t->data);   
        if (t->lchild)   
        print(t->lchild,depth+1);   
    }   
}    
  
int main()   
{   
    char tree[50];   
    gets(tree);   
    AVLTree root = NULL;   
    for (int i=0; tree[i]; i++)   
    {   
        root=insert(tree[i], root);   
    }  
    printf("Preorder: ");   
    preorder(root);  
    printf("\n");     
    printf("Inorder: ");      
    inorder(root);  
    printf("\n");     
    printf("Postorder: ");    
    postorder(root);  
    printf("\n");     
    printf("Tree:\n");   
    print(root,0);    
    return 0;   
}   

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值